1. Data preprocessing
  1. Read FlowJo files into R.
  2. Create a data frame with intensity measurements for each marker for all samples within the experiment to be analyzed.
  3. Harmonize data
  4. Create dataframe
  5. Create a Seurat object
  1. Cluster data
  1. Explore clustering methods and parameters.
  2. Determine cluster stability
  3. Create clusters with best conditions
  1. Annotate clusters with cell types.
  1. Predict cell types by correlation matrix
  2. Visualize expression by cluster for manual annotation
  3. With annotated an data set train Random Forest classifier to predict cell types.
  4. With annotated an data set predict cell types with Seurat label transfer.
  5. For each prediction calculate the top most predicted cell per cluster and take a consensus to annotate clusters.
  6. Add cluster annotations.
# load necessary libraries 
library(Seurat)
Attaching SeuratObject
library(dplyr) 
library(ggplot2)

Attaching package: ‘ggplot2’

The following object is masked from ‘package:CelltypeR’:

    annotate
library(CelltypeR)

Preprocessing

Read in the flow data This data should be the gated live cells.
All samples need to be in one folder.


input_path <- "/Users/rhalenathomas/Documents/Data/FlowCytometry/PhenoID/FlowDataFiles/9MBO"
output_path <- "/Users/rhalenathomas/Documents/Data/FlowCytometry/PhenoID/Analysis/testingLibrary/"

# 1.a Read in FlowJo Files 

# In Figure 3 downsample to 9000 where possible
# Here downsample to 1000 to speed up computation
flowset <- fsc_to_fs(input_path, downsample = 1000)
# down sample can be a number, 'none' or 'min'

# look at file names and rename with shorter sample names

sampleNames(flowset)
[1] "2020-03-06- export_bioinfo_3450c_live cells.fcs"      
[2] "2020-03-06- export_bioinfo_AIW_live cells.fcs"        
[3] "2020-03-06- export_bioinfo_AJG_live cells.fcs"        
[4] "2020-03-17- export_bioinfo_old 3450c_live cells.fcs"  
[5] "2020-03-17- export_bioinfo_old AIW_live cells.fcs"    
[6] "2020-03-17- export_bioinfo_old AJG_live cells.fcs"    
[7] "2020-03-17- export_bioinfo_young 3450c_live cells.fcs"
[8] "2020-03-17- export_bioinfo_young AIW_live cells.fcs"  
[9] "2020-03-17- export_bioinfo_young AJG_live cells.fcs"  
sampleNames(flowset) <- sampleNames(flowset) <- c("3450_0306","AIW002_0306","AJG001C_0306","3450_0317A","AIW002_0317A","AJG001C_0317A","3450_0317B","AIW002_0317B","AJG001C_0317B")
sampleNames(flowset)
[1] "3450_0306"     "AIW002_0306"   "AJG001C_0306" 
[4] "3450_0317A"    "AIW002_0317A"  "AJG001C_0317A"
[7] "3450_0317B"    "AIW002_0317B"  "AJG001C_0317B"
# if we want to save the flowset object now we can 
# this would be read back in with flowset 
# 

Harmonize data to remove batch or technical variation

This requires us to look and see where there are two peaks to align. We need to visualize the peaks of the transformed data before aligning.



# we can decided what level of processing to choose with the argument 'processing'
# biexp only applies a biexponential transformation
# align applies biexp transform and then aligns peaks
# retro (default), transforms, aligns and then reverse transforms
flowset_biexp <- harmonize(flowset, processing = 'biexp')
# we can visualize the peaks to see where there are two peaks for alignment

# we need to enter the column index for which peaks to align, the alignment for one or two peaks is not the same. 
#plotdensity_flowset(flowset)
#plotdensity_flowset(flowset_biexp) # to see the peaks

flowset_align <- harmonize(flowset, processing = 'align', 
                           two_peaks = c(7:20),
                       one_peak = c(1:6,21), threshold = 0.01)
*** recursive gc invocation
*** recursive gc invocation
*** recursive gc invocation
*** recursive gc invocation
*** recursive gc invocation
*** recursive gc invocation
*** recursive gc invocation
*** recursive gc invocation
*** recursive gc invocation
*** recursive gc invocation

Adjusting the distance between landmarks
.........

Adjusting the distance between landmarks
.........
flowset_retro <- harmonize(flowset, processing = 'retro', 
                           two_peaks = c(7:20),
                       one_peak = c(1:6,21), threshold = 0.01)

Adjusting the distance between landmarks
.........

Adjusting the distance between landmarks
.........
### test again later without running library(flowCore)
df <- flowset_to_csv(flowset_retro)

Now we have made all the different processing of the fsc files. We can visualize the intensity in cell density plots to see the alignment

#plotdensity_flowset(flowset)

plotdensity_flowset(flowset_biexp)
Warning in melt(lapply(as.list(flowset@frames), function(x) { :
  The melt generic in data.table has been passed a list and will attempt to redirect to the relevant reshape2 method; please note that reshape2 is deprecated, and this redirection is now deprecated as well. To continue using melt methods from reshape2 while both libraries are attached, e.g. melt.list, you can prepend the namespace like reshape2::melt(lapply(as.list(flowset@frames), function(x) {    x = as.data.frame(x@exprs)})). In the next version, this warning will become an error.
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
Warning in geom_density_ridges(alpha = 0.4, verbose = FALSE) :
  Ignoring unknown parameters: `verbose`
Picking joint bandwidth of 0.0779
Picking joint bandwidth of 0.0498
Picking joint bandwidth of 0.0278
Picking joint bandwidth of 0.136
Picking joint bandwidth of 0.11
Picking joint bandwidth of 0.0292
Picking joint bandwidth of 1.27
Picking joint bandwidth of 0.253
Picking joint bandwidth of 1.21
Picking joint bandwidth of 1.46
Picking joint bandwidth of 0.405
Picking joint bandwidth of 0.398
Picking joint bandwidth of 0.267
Picking joint bandwidth of 0.638
Picking joint bandwidth of 1.01
Picking joint bandwidth of 1.25
Picking joint bandwidth of 0.97
Picking joint bandwidth of 0.42
Picking joint bandwidth of 1.22
Picking joint bandwidth of 0.973
Picking joint bandwidth of 0.175

plotdensity_flowset(flowset_align)
Warning in melt(lapply(as.list(flowset@frames), function(x) { :
  The melt generic in data.table has been passed a list and will attempt to redirect to the relevant reshape2 method; please note that reshape2 is deprecated, and this redirection is now deprecated as well. To continue using melt methods from reshape2 while both libraries are attached, e.g. melt.list, you can prepend the namespace like reshape2::melt(lapply(as.list(flowset@frames), function(x) {    x = as.data.frame(x@exprs)})). In the next version, this warning will become an error.
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
No id variables; using all as measure variables
Warning in geom_density_ridges(alpha = 0.4, verbose = FALSE) :
  Ignoring unknown parameters: `verbose`
Picking joint bandwidth of 0.0779
Picking joint bandwidth of 0.0498
Picking joint bandwidth of 0.0278
Picking joint bandwidth of 0.136
Picking joint bandwidth of 0.11
Picking joint bandwidth of 0.0292
Picking joint bandwidth of 1.27
Picking joint bandwidth of 0.357
Picking joint bandwidth of 1.22
Picking joint bandwidth of 1.47
Picking joint bandwidth of 0.485
Picking joint bandwidth of 0.391
Picking joint bandwidth of 0.265
Picking joint bandwidth of 0.659
Picking joint bandwidth of 1.01
Picking joint bandwidth of 1.29
Picking joint bandwidth of 0.967
Picking joint bandwidth of 0.424
Picking joint bandwidth of 1.24
Picking joint bandwidth of 0.97
Picking joint bandwidth of 0.175

#plotdensity_flowset(flowset_retro)

# the function make_seu will take in the df of expression and Antibody/Marker list as a vector and create a seurat object. Values are scaled. Marker expression will be in the "RNA" slot. PCA is calculated using AB vector as the features 

# make sure to always keep the same antibody order or your labels will not be correct


# antibody features in order to appear on the plots
AB <- c("CD24","CD56","CD29","CD15","CD184","CD133","CD71","CD44","GLAST","AQP4","HepaCAM", "CD140a","O4")
seu <- make_seu(df, AB_vector = AB)
Centering and scaling data matrix

  |                                                              
  |                                                        |   0%
  |                                                              
  |========================================================| 100%
Warning in irlba(A = t(x = object), nv = npcs, ...) :
  You're computing too large a percentage of total singular values, use a standard svd instead.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
PC_ 1 
Positive:  CD44, CD184, CD15, CD24, CD56, CD133 
Negative:  CD29, CD140a, O4, CD71, AQP4, HepaCAM 
PC_ 2 
Positive:  CD15, CD56, GLAST, CD140a, AQP4, O4 
Negative:  CD29, CD44, CD184, CD133, CD24, HepaCAM 
PC_ 3 
Positive:  CD56, CD29, CD133, GLAST, AQP4, CD71 
Negative:  CD44, CD184, CD140a, O4, HepaCAM, CD15 
PC_ 4 
Positive:  CD56, CD24, CD29, CD15, CD140a, CD184 
Negative:  CD133, AQP4, HepaCAM, CD71, O4, GLAST 
PC_ 5 
Positive:  CD184, CD24, CD133, O4, CD140a, HepaCAM 
Negative:  CD44, CD71, CD56, CD15, AQP4, GLAST 

You can save the data frame and seurat object for later



# to save the df for later
write.csv(df, paste(output_path,"df1000.csv", sep = ""))

# save the seurat object
saveRDS(seu, paste(output_path, "seuratObject1000.csv", sep = ""))

Read in the csv of the flow files processed and the seurat object

df.input <- read.csv(paste(output_path, "df1000.csv", sep = ""))

seu <- readRDS(paste(output_path, "seuratObject1000.csv", sep = ""))

Test out clustering methods

  1. Flowsom - requires the data frame from above
  2. Phenograph - requires Seurat object from above
  3. Louvain via Seurat - requires Seurat object from above

To run intrinsic statistics we need the data frame for all clustering methods. 1. Silhouette score: -1 to 1.A value near -1 indicates a poor quality of the clusters a value near 1 indicates a good quality of the clusters. 2. Calinski-Harabasz index: higher values indicate better quality clusters. 3. Davies-Bouldin index: lower values indicate better clusters. The min value is 0.

Note that even with only 1000 cells these processes are slow and if you want to test larger data sets use base R and HPC.

Test Flowsom


library(clustree)

# the lowest flow_k to use is 3

flow.test <- explore_param(input = seu,
                          cluster_method = 'flowsom', 
                          df_input= df.input, 
                          flow_k = c(5,10,15,20),
                          pheno_lou_kn = NULL, 
                          lou_resolution = NULL, 
                          run.plot = TRUE, 
                          run.stats = TRUE, 
                          save_to = NULL)

Notice in the UMAPs and heatmaps a large amount of cells are all in one or two clusters and small amounts of cells going into small clusters. This isn’t good for us to label cell types.

# Look at the intrinsic statistics
flow.test[[1]]

The statistics indicate that the fewer the lowest K value has the best quality clusters.

Test Phenograph clustering


pheno.test <-  explore_param(seu, #for phenograph and louvain only
                          cluster_method = 'phenograph', #take 1 cluster method
                          df_input= df.input, #needed  if input "flowsom"
                          flow_k = NULL, #k for flowsom
                          pheno_lou_kn = c(150,300,500), #kn for phenograph or louvain
                          lou_resolution = NULL, #resolution for louvain
                          run.plot = TRUE, #print if run
                          run.stats = TRUE, #print and return if run
                          save_to = NULL)

## clustree in phenograph doesn't make sense but I've included it to see it anyway

# look at the intrinsic stats table
pheno.test[[1]]

The silhouette score and DBI are best for fewer kn = 500 but the CHI is best for kn = 300. The stats on contradicting.

Test Louvain clustering


# for best clustree visualization include resolution 0

lou.test <- explore_param(input = seu, #for phenograph and louvain only
                          cluster_method = "louvain", 
                          df_input = df.input, 
                          flow_k = NULL, 
                          pheno_lou_kn = c(60, 200), 
                          lou_resolution = c(0,0.25,0.5,0.8), 
                          run.plot = TRUE, 
                          run.stats = TRUE, 
                          save_to = NULL)
lou.test[[1]]

The statistic differ for best clustering. Overall the intrinsic statistics are not helpful for this data for choosing cluster conditions. We decided to use the heatmaps and UMAPS for clusters that look best for annotation. We want clusters that are distinct from eachother on the UMAP and have clear markers on the heatmap. We then used the RAND Index to determine the final cluster conditions.

Check cluster stability - best resolution/cluster number/k value by calculating RAND Index and STD of cluster number


RI <- clust_stability(input = seu,
                       resolutions = c(0.1,0.25,0.5,0.8,1),
                       kn = 60,
                       n = 5, #number of iterations
                       save_to = NULL)

# it is recommended to run n= 100, however I ran only 5 here because it is long to calculate
 
#Look at the RI results
plot_randindex(
    rdf = RI$list,
    cp = c("orange", "violet"),
    view = c(0, 1) #zoom in x axis, this does not changes scales, just the viewable sections
)

# The RAND index indicates if cells are put into the same cluster each time the clustering is repeated - 1 mean they are exactly the same. We ran 10 times so there are 9 RI for each resolution.  There are 10 counts of the number of clusters (one for each iteration). Cluster number too low will not account for the true differences in groups, cluster numbers too high are difficult to annotate.

After checking parameters run cluster function to make add the clustering information into the


seu <- get_clusters(seu, method = "louvain",
                         df_input = df.input,
                         k = 60,
                         resolution = 1,
                         plots = TRUE,
                         save_plots = FALSE)
Computing nearest neighbor graph
Computing SNN
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 9000
Number of edges: 862796

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.7641
Number of communities: 12
Elapsed time: 2 seconds
[1] "method is Louvain"
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
00:17:46 UMAP embedding parameters a = 0.4502 b = 1.076
00:17:46 Read 9000 rows and found 12 numeric columns
00:17:46 Using Annoy for neighbor search, n_neighbors = 60
00:17:46 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
00:17:46 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpZxwI5C/filea5818fc2e30
00:17:46 Searching Annoy index using 1 thread, search_k = 6000
00:17:51 Annoy recall = 100%
00:17:51 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 60
00:17:52 Initializing from normalized Laplacian + noise (using irlba)
00:17:52 Commencing optimization for 500 epochs, with 756780 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
00:18:10 Optimization finished

# if save_plots is TRUE the feature plots will be save as 13 plots in one file. The UMAP with cluster numbers will also be saved.

Annotate clusters

  1. Visualization for manual annotation. - output by clustering function
  2. CAM (Correlation assignment model) - requires reference matrix
  3. RFM (Random Forest Model) - requires annotated matching flow dataset
  4. Seurat label transfer - requires annotated matching flow data in a seurat object

Visualize expression on UMAP and with heat maps


AB <- c("CD24","CD56","CD29","CD15","CD184","CD133","CD71","CD44","GLAST","AQP4","HepaCAM", "CD140a","O4")


# this will let us see one at at time
for (i in AB) {
  print(FeaturePlot(seu, features = i, min.cutoff = 'q1', max.cutoff = 'q97', label = TRUE))
}

NA
NA

Some more visualization of expression values


# summary heat map
# use function plotmean

length(unique(seu$RNA_snn_res.1))
[1] 12
# 12 
# if we want to plot by cluster we need a vector of from 0 to the n-1 clusters
cluster.num <- c(0:11)

plotmean(plot_type = 'heatmap',seu = seu, group = 'RNA_snn_res.1', markers = AB, 
                     var_names = cluster.num, slot = 'scale.data', xlab = "Cluster",
         ylab = "Antibody")

NA
NA
saveRDS(seu, paste(output_path, "Seurat_temp.RDS", sep = ""))

Predict cell annotations with CAM (Corralations assignment method)


reference_path <- "/Users/rhalenathomas/GITHUB/CelltypeR/Data/ReferenceMatrix9celltypesOrdered.csv"

reference_data <- read.csv(reference_path)

cor <- find_correlation(test = df.input, 
                             reference = reference_data, 
                             min_corr = 0.45, 
                             min_diff = 0.05)

# creates a dataframe with cor1 cor2 and predicted cell type label

Visualize the CAM results


plot_corr(cor)
Warning in melt(df) :
  The melt generic in data.table has been passed a data.frame and will attempt to redirect to the relevant reshape2 method; please note that reshape2 is deprecated, and this redirection is now deprecated as well. To continue using melt methods from reshape2 while both libraries are attached, e.g. melt.list, you can prepend the namespace like reshape2::melt(df). In the next version, this warning will become an error.
Using X, best.cell.type, second.cell.type, cell.label as id variables
Warning in melt(df.downsample) :
  The melt generic in data.table has been passed a data.frame and will attempt to redirect to the relevant reshape2 method; please note that reshape2 is deprecated, and this redirection is now deprecated as well. To continue using melt methods from reshape2 while both libraries are attached, e.g. melt.list, you can prepend the namespace like reshape2::melt(df.downsample). In the next version, this warning will become an error.
Using X, best.cell.type, second.cell.type, cell.label as id variables
Warning in melt(double.cells) :
  The melt generic in data.table has been passed a data.frame and will attempt to redirect to the relevant reshape2 method; please note that reshape2 is deprecated, and this redirection is now deprecated as well. To continue using melt methods from reshape2 while both libraries are attached, e.g. melt.list, you can prepend the namespace like reshape2::melt(double.cells). In the next version, this warning will become an error.
Using X, best.cell.type, second.cell.type, cell.label as id variables
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

Apply correlation predictions to clusters and output a vector for annotation functions



# add the correlation predictions to the meta data
seu <- AddMetaData(object=seu, metadata=cor$cell.label, col.name = 'cor.labels')
# see the labels added
unique(seu$cor.labels)
 [1] "unknown"               "Astrocyte"            
 [3] "RG"                    "Neuron"               
 [5] "OPC"                   "Astrocyte-RG"         
 [7] "NPC"                   "Endothelial"          
 [9] "StemCell"              "StemCell-Neuron"      
[11] "Oligo"                 "StemCell-Oligo"       
[13] "Oligo-NPC"             "Neuron-StemCell"      
[15] "NPC-Neuron"            "OPC-Neuron"           
[17] "Oligo-OPC"             "Neuron-NPC"           
[19] "NPC-StemCell"          "StemCell-OPC"         
[21] "Neuron-OPC"            "StemCell-NPC"         
[23] "RG-Astrocyte"          "OPC-StemCell"         
[25] "RG-Endothelial"        "Endothelial-RG"       
[27] "Astrocyte-Endothelial" "Endothelial-Astrocyte"
[29] "OPC-Oligo"             "StemCell-Endothelial" 
[31] "OPC-NPC"               "Oligo-StemCell"       
[33] "NPC-RG"               
seu.cluster = seu$RNA_snn_res.1
seu.labels = seu$cor.labels

# plot the cluster predictions
plot_lab_clust(seu, seu$RNA_snn_res.1, seu$cor.labels)

NA
NA
NA
NA

Run get annotations function to return a vector of annotation in the order of the clusters.


cor.ann <- get_annotation(seu, seu.cluster = seu$RNA_snn_res.1, 
                          seu.label = seu$cor.labels, top_n = 3, 
                          filter_out = c("Unknown","unknown","Mixed"), 
                          Label = "CAM")
[1] "filtering"
cor.ann
dim(cor.ann)
[1] 12  2
cor.ann <- cor.ann[1:12,]
dim(cor.ann)
[1] 12  2
unique(cor.ann$CAM)
[1] StemCell    Astrocyte   RG          Endothelial OPC        
33 Levels: Astrocyte Astrocyte-Endothelial ... unknown
length(cor.ann$CAM)
[1] 12

Use a trained Random Forest model to predict cell types. Training of the Random Forest model with an annotated data set is below.

seu <- AddMetaData(object=seu, metadata=rfm.pred$rfm.labels, col.name = 'rfm.labels')

# check that the data is added 
table(seu$rfm.labels)

          Unknown             Mixed         Neurons 1 
               10              6563              1068 
    Radial Glia 1        Epithelial      Astrocytes 1 
               78               700                43 
        Neurons 2      Astrocytes 2      Astrocytes 3 
                0                43                 1 
Astrocytes mature         Neurons 3               NPC 
               56               330                64 
    Radial Glia 2     Radial Glia 3       Endothelial 
                1                 0                43 
 Oligodendrocytes       Stem-like 1       Stem-like 2 
                0                 0                 0 
      Neural stem 
                0 

Get the annotation by cluster for the RFM

Plot RFM predictions



plot_lab_clust(seu, seu.cluster = seu$RNA_snn_res.1, seu.labels = seu$rfm.labels, filter_out = c("unknown","Unknown","Mixed"))

NA
NA

Predicting cell types with Seurat label transfer using anchors


# takes in a seurat object with the labels added 
# makes a dataframe with the count of predicted labels for each cluster
# input seurat object with the predicted labels in the meta data
# input the clusters meta data slot to be labels
# input the meta data slot with the labels (correlation, random forest, seurat predicted)

#need reference data object with labels
seu.r<- readRDS("/Users/rhalenathomas/Documents/Data/FlowCytometry/PhenoID/Analysis/PaperFigures/Seu9000annot.08072021.RDS")


# the output is a seurat object with the predicted annotations

seu <- seurat_predict(seu, seu.r, ref_id = 'subgroups', down.sample = 500, markers = AB)
Projecting cell embeddings
Finding neighborhoods
Finding anchors
    Found 17519 anchors
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Warning: Requested number is larger than the number of available items (13). Setting to 13.
Filtering anchors
    Retained 10364 anchors
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Predicting cell labels

# plot the seurat anchor predictions
# get the annotation table for the seurat anchor predictions 

plot_lab_clust(seu, seu$RNA_snn_res.1, seu$seu.pred)


# to not filter anything use c()
seu.ann <- get_annotation(seu, seu$RNA_snn_res.1,seu$seu.pred, 
               top_n = 3, filter_out = c(), Label = "Seurat")
[1] "not filtering"
seu.ann
NA
NA

Get a consensus of cluster annotations, Add the annotations to the seurat object


# make a list of data frames
# all the dataframes need to be as.factor
ann.list <- list(cor.ann,rfm.ann,seu.ann, man.ann)

# annotate the seurat object

seu <- cluster_annotate(seu, ann.list = ann.list, 
                        annotation_name ="CellType", 
                        to_label = "RNA_snn_res.1")

DimPlot(seu, group.by = "CellType")

NA
NA

Just use the annotate functions


seu <- annotate(seu, annotations = seu.ann$Seurat, to_label = "RNA_snn_res.1", annotation_name = "SeuratTransfer")

DimPlot(seu, group.by = "SeuratTransfer")

Compare groups

We first need to add the variables into the seurat object that we want to compare.

Genotype <- c("3450","3450","3450","AIW002","AIW002","AIW002","AJG001C","AJG001C","AJG001C")
ExDate <- c("0306","0317","0317","0306","0317","0317","0306","0317","0317")
Batch <- c("B","B","A","B","B","A","B","B","A")
Age <- c("273","284","263","273","284","263","273","284","263")

# Genotype
Idents(seu) <- "Sample"
cluster.ids <- Genotype
# vector with the new names - you need this vector from me

names(cluster.ids) <- levels(seu)    # get the levels
seu <- RenameIdents(seu, cluster.ids) # rename  
seu$Genotype <- Idents(seu)   # add a new dataslot

# Experiment date
Idents(seu) <- "Sample"
cluster.ids <- ExDate
# vector with the new names - you need this vector from me

names(cluster.ids) <- levels(seu)    # get the levels
seu <- RenameIdents(seu, cluster.ids) # rename  
seu$ExDate <- Idents(seu)   # add a new dataslot

# Batch
Idents(seu) <- "Sample"
cluster.ids <- Batch
# vector with the new names - you need this vector from me

names(cluster.ids) <- levels(seu)    # get the levels
seu <- RenameIdents(seu, cluster.ids) # rename  
seu$Batch <- Idents(seu)   # add a new dataslot

# days in final differentiation media
Idents(seu) <- "Sample"
cluster.ids <- Age
# vector with the new names - you need this vector from me

names(cluster.ids) <- levels(seu)    # get the levels
seu <- RenameIdents(seu, cluster.ids) # rename  
seu$DaysinCulture <- Idents(seu)   # add a new dataslot

Plots some variables to look for differences between groups

# one plot
proportionplots(seu.q,seu.var = seu$Genotype, seu.lable = seu$CellType, groups = "Genotype")
[1] "Number of colours needed7"
[1] "Number of colours entered 1"
[1] "Default ggplot colours used"

# add colours
colours <- c("chocolate1","chocolate3","orange",
                   "lightsalmon", "pink","lightpink3",
                   "steelblue3","deepskyblue",
                   "plum3","purple",
                   "seagreen3","tomato4","burlywood3","grey90","brown",
             "royalblue3", "tan4","yellowgreen")

proportionplots(seu.q,seu.var = seu$Genotype, seu.lable = seu$CellType, groups = "Genotype", my_colours = colours)
[1] "Number of colours needed7"
[1] "Number of colours entered 18"
[1] "Custome colours used."

var.list <- list(seu$DaysinCulture,seu$Batch,seu$ExDate,seu$Genotype)
varnames <- c("Days in Culture", "Batch", "Experiment Date", "Genotype")
# plot all the variables of interest at once

plotproportions(seu, var.list = var.list, xgroup = seu$CellType, varnames = varnames, my_colours = c("blue","red"))
[1] "Number of colours needed7"
[1] "Number of colours entered 2"
[1] "Default ggplot colours used"
[1] "Number of colours needed7"
[1] "Number of colours entered 2"
[1] "Default ggplot colours used"
[1] "Number of colours needed7"
[1] "Number of colours entered 2"
[1] "Default ggplot colours used"
[1] "Number of colours needed7"
[1] "Number of colours entered 2"
[1] "Default ggplot colours used"

Make a heat map


# make sure the order is correct and there are only the amount of different cell types.  The order can be found in the dimplot above 

var_names <- c("unknown","astrocyte","epithelial","neurons 1",
               "endothelial", "npc","astrocytes")

plotmean(plot_type = 'heatmap',seu = seu, group = 'CellType', markers = AB, 
                     var_names = var_names, slot = 'scale.data', xlab = "Cell Type",
         ylab = "Antibody")

NA
NA
NA
NA
# dot plot
var_names <- c("unknown","astrocyte","epithelial","neurons 1",
               "endothelial", "npc","astrocytes")


# make sure the terms are exactly the same and you don't miss any
new.order <- c("astrocyte","astrocytes","endothelial","epithelial","neurons 1",
               "npc","unknown")
new.order <- rev(new.order)

AB.order <- c("CD24","CD56","CD29","CD15","CD184","CD133","CD71","CD44","GLAST","AQP4","HepaCAM", "CD140a","O4")

plotmean(plot_type = 'dotplot',seu = seu, group = 'CellType', markers = AB, 
                     var_names = var_names, slot = 'scale.data', xlab = "Cell Type",
         ylab = "Antibody", var1order = new.order, var2order = AB.order)

NA
NA

Statistics comparing groups


# prepare a dataframe for stats
# this function takes the annotated seurat object with all the variables already existing as metadata slots

# check what meta data slots exist in your object
colnames(seu@meta.data)
 [1] "orig.ident"      "nCount_RNA"      "nFeature_RNA"    "Sample"         
 [5] "RNA_snn_res.1"   "seurat_clusters" "cor.labels"      "rfm.labels"     
 [9] "seu.pred"        "CellType"        "MyCellType"      "SeuratTransfer" 
[13] "Genotype"        "ExDate"          "Batch"           "DaysinCulture"  
# run the function

var.names <- c("Sample","DaysinCulture", "Batch", "ExDate", "Genotype", "CellType")

df.for.stats <- Prep_for_stats(seu, marker_list = AB, variables = var.names, 
                               marker_name = 'Marker')


# save the csv for later
# write.csv(df.for.stats, paste(output_path,"filename.csv"))

head(df.for.stats)
NA
NA

First we have 3 variables: Experimental variable, Cell types, Markers We want to compare the mean expression per group: For all antibodies together in each cell type between a given variable (Genotype) (One way anova) We want to compare each antibody separately for a given variable for each cell type (two way anova)



# one way anova (combine all antibodies)
# two way anova variable 1 = antibody/marker variable 2 = group variable

# normally runs a loop across each cell type
# option to select to calculate for all cell types together

# can run the loop across antibodies

# group variables we can run: Genotype, Batch, days in culture, Experiment date

# we run one-way here with different conditions

# compare genotypes for each cell type
test.stats1 <- run_stats(input_df= df.for.stats, group_cols = c("Sample", "CellType","Marker","Genotype","Batch"),
                     value_col = "value",
                     stat_type = "ANOVA", id1 = 'Genotype', 
                     id2 = NULL, use_means = TRUE,
                     loop_by = "CellType")
[1] "ANOVA results for each cell type comparing  Genotype"
[1] "TukeyHSD results for each cell type comparing  Genotype"
# see the dataframe results
test.stats1[['ANOVA']]
test.stats1[['TukeyHSD']]
NA
NA
NA
# Compare expression across cell types for each marker
test.stats2 <- run_stats(input_df= df.for.stats, group_cols = c("Sample", "CellType","Marker","Genotype","Batch"),
                     value_col = "value",
                     stat_type = "ANOVA", id1 = 'Genotype', 
                     id2 = NULL, use_means = TRUE,
                     loop_by = "Marker")
[1] "ANOVA results for each marker comparing  Genotype"
[1] "Tukey results for each marker comparing  Genotype"
test.stats2[['TukeyHSD']]
# compare Genotypes across all cell types and markers
test.stats3 <- run_stats(input_df= df.for.stats, group_cols = c("Sample", "CellType","Marker"),
                     value_col = "value",
                     stat_type = "ANOVA", id1 = 'Genotype', 
                     id2 = NULL, use_means = TRUE,
                     loop_by = 'none')
[1] "ANOVA results for all celltypes and markers combined"
[1] "TukeyHSD results for all celltypes and markers combined"
test.stats3[['TukeyHSD']]

Test two way ANOVAs

df <- as.data.frame(test.stats5[["TukeyHSD"]][["Interactions_ Genotype"]])
head(df)


# now filter for significant differences

df_sig <- df %>% filter(p.adj < 0.05)
df_sig

df <- as.data.frame(test.stats6[["TukeyHSD"]][["Interactions_ Genotype"]])
head(df)


# now filter for significant differences

df_sig <- df %>% filter(p.adj < 0.05)
df_sig

df <- as.data.frame(test.stats6[["TukeyHSD"]][["Interactions_ CellType"]])
head(df)
# now filter for significant differences
df_sig <- df %>% filter(p.adj < 0.05)
df_sig
NA

Train Random Forest model Requires a labelled seurat object More cells will give higher accuracy but increase computation time. Run in HPC with lots of cells


rf <- RFM_train(seurate_object = seu, 
                             AB_list = AB, annotations = seu$CellType,
                      split = c(0.8,0.2),
                      downsample = "none",
                      seed = 222,
                      mytry = c(1:10),
                      maxnodes = c(12: 25),
                      trees = c(250, 500, 1000,2000),
                      start_node = 15)
[1] "optimize number of features to draw"
Loading required package: lattice

Attaching package: ‘lattice’

The following objects are masked from ‘package:CelltypeR’:

    barchart, bwplot, densityplot, histogram
[1] "Best number of features to draw is 4"
[1] "Max accuracy is 0.917396283499885"
[1] "Searching for best max node size"
[1] "The max accuracy is 0.818559556786704. For the maxnodes of 24"
[1] "searching for best number of trees"
[1] "Best trees  250"
[1] "The max accuracy is 0.820193637621023. For 250 trees"
[1] "predict training data"
Confusion Matrix and Statistics

             Reference
Prediction    unknown astrocyte epithelial neurons 1 endothelial  npc astrocytes
  unknown        1163       126         22        34         115   68         68
  astrocyte        40      2395        171        81         139   48         72
  epithelial        7        24        570         2          12   10         25
  neurons 1        11        40         46      1134          38   28         26
  endothelial       1        12          4         3         516    5         11
  npc               0         2          0         0           3  151          3
  astrocytes        0         0          0         0           0    0          1

Overall Statistics
                                          
               Accuracy : 0.8205          
                 95% CI : (0.8115, 0.8293)
    No Information Rate : 0.3596          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.7653          
                                          
 Mcnemar's Test P-Value : < 2.2e-16       

Statistics by Class:

                     Class: unknown Class: astrocyte Class: epithelial
Sensitivity                  0.9517           0.9215           0.70111
Specificity                  0.9279           0.8809           0.98753
Pos Pred Value               0.7287           0.8130           0.87692
Neg Pred Value               0.9895           0.9523           0.96305
Prevalence                   0.1691           0.3596           0.11249
Detection Rate               0.1609           0.3314           0.07887
Detection Prevalence         0.2208           0.4076           0.08994
Balanced Accuracy            0.9398           0.9012           0.84432
                     Class: neurons 1 Class: endothelial Class: npc
Sensitivity                    0.9043            0.62697    0.48710
Specificity                    0.9684            0.99438    0.99884
Pos Pred Value                 0.8571            0.93478    0.94969
Neg Pred Value                 0.9797            0.95401    0.97750
Prevalence                     0.1735            0.11388    0.04289
Detection Rate                 0.1569            0.07140    0.02089
Detection Prevalence           0.1831            0.07638    0.02200
Balanced Accuracy              0.9363            0.81068    0.74297
                     Class: astrocytes
Sensitivity                  0.0048544
Specificity                  1.0000000
Pos Pred Value               1.0000000
Neg Pred Value               0.9716302
Prevalence                   0.0285042
Detection Rate               0.0001384
Detection Prevalence         0.0001384
Balanced Accuracy            0.5024272
[1] "predict test data"
Confusion Matrix and Statistics

             Reference
Prediction    unknown astrocyte epithelial neurons 1 endothelial npc astrocytes
  unknown         296        28          8         8          29  18         19
  astrocyte         6       576         42        14          33  18         17
  epithelial        6         9        110         1           5   2          5
  neurons 1         4        21         13       286           4   8         13
  endothelial       2         5          2         3         123   0          2
  npc               0         0          0         0           0  36          1
  astrocytes        0         0          0         0           0   0          0

Overall Statistics
                                          
               Accuracy : 0.8049          
                 95% CI : (0.7856, 0.8231)
    No Information Rate : 0.3604          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.7446          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: unknown Class: astrocyte Class: epithelial
Sensitivity                  0.9427           0.9014           0.62857
Specificity                  0.9246           0.8854           0.98248
Pos Pred Value               0.7291           0.8159           0.79710
Neg Pred Value               0.9868           0.9410           0.96024
Prevalence                   0.1771           0.3604           0.09870
Detection Rate               0.1669           0.3249           0.06204
Detection Prevalence         0.2290           0.3982           0.07783
Balanced Accuracy            0.9336           0.8934           0.80552
                     Class: neurons 1 Class: endothelial Class: npc
Sensitivity                    0.9167            0.63402    0.43902
Specificity                    0.9569            0.99113    0.99941
Pos Pred Value                 0.8195            0.89781    0.97297
Neg Pred Value                 0.9817            0.95660    0.97350
Prevalence                     0.1760            0.10942    0.04625
Detection Rate                 0.1613            0.06937    0.02030
Detection Prevalence           0.1968            0.07727    0.02087
Balanced Accuracy              0.9368            0.81258    0.71922
                     Class: astrocytes
Sensitivity                    0.00000
Specificity                    1.00000
Pos Pred Value                     NaN
Neg Pred Value                 0.96785
Prevalence                     0.03215
Detection Rate                 0.00000
Detection Prevalence           0.00000
Balanced Accuracy              0.50000
#save(rf, output_path,"trainedRFM.Rds")
LS0tCnRpdGxlOiAiQ2VsbHR5cGVSIHdvcmtmbG93IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoxLiBEYXRhIHByZXByb2Nlc3NpbmcKYS4gUmVhZCBGbG93Sm8gZmlsZXMgaW50byBSLgpiLiBDcmVhdGUgYSBkYXRhIGZyYW1lIHdpdGggaW50ZW5zaXR5IG1lYXN1cmVtZW50cyBmb3IgZWFjaCBtYXJrZXIgZm9yIGFsbCAgICAgICAgICBzYW1wbGVzIHdpdGhpbiB0aGUgZXhwZXJpbWVudCB0byBiZSBhbmFseXplZC4gIApjLiBIYXJtb25pemUgZGF0YSAKZC4gQ3JlYXRlIGRhdGFmcmFtZQplLiBDcmVhdGUgYSBTZXVyYXQgb2JqZWN0CgoyLiBDbHVzdGVyIGRhdGEKYS4gRXhwbG9yZSBjbHVzdGVyaW5nIG1ldGhvZHMgYW5kIHBhcmFtZXRlcnMuCmIuIERldGVybWluZSBjbHVzdGVyIHN0YWJpbGl0eQpjLiBDcmVhdGUgY2x1c3RlcnMgd2l0aCBiZXN0IGNvbmRpdGlvbnMKCjMuIEFubm90YXRlIGNsdXN0ZXJzIHdpdGggY2VsbCB0eXBlcy4KYS4gUHJlZGljdCBjZWxsIHR5cGVzIGJ5IGNvcnJlbGF0aW9uIG1hdHJpeApiLiBWaXN1YWxpemUgZXhwcmVzc2lvbiBieSBjbHVzdGVyIGZvciBtYW51YWwgYW5ub3RhdGlvbgpjLiBXaXRoIGFubm90YXRlZCBhbiBkYXRhIHNldCB0cmFpbiBSYW5kb20gRm9yZXN0IGNsYXNzaWZpZXIgdG8gcHJlZGljdCBjZWxsICAgICAgICB0eXBlcy4KZC4gV2l0aCBhbm5vdGF0ZWQgYW4gZGF0YSBzZXQgcHJlZGljdCBjZWxsIHR5cGVzIHdpdGggU2V1cmF0IGxhYmVsIHRyYW5zZmVyLgplLiBGb3IgZWFjaCBwcmVkaWN0aW9uIGNhbGN1bGF0ZSB0aGUgdG9wIG1vc3QgcHJlZGljdGVkIGNlbGwgcGVyIGNsdXN0ZXIgYW5kICAgICAgICB0YWtlIGEgY29uc2Vuc3VzIHRvIGFubm90YXRlIGNsdXN0ZXJzLgpmLiBBZGQgY2x1c3RlciBhbm5vdGF0aW9ucy4KCgoKYGBge3J9CiMgbG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzIApsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShkcGx5cikgCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShDZWxsdHlwZVIpCgpgYGAKCgojIFByZXByb2Nlc3NpbmcKClJlYWQgaW4gdGhlIGZsb3cgZGF0YQpUaGlzIGRhdGEgc2hvdWxkIGJlIHRoZSBnYXRlZCBsaXZlIGNlbGxzLiAgCkFsbCBzYW1wbGVzIG5lZWQgdG8gYmUgaW4gb25lIGZvbGRlci4KCgpgYGB7cn0KCmlucHV0X3BhdGggPC0gIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL0Zsb3dDeXRvbWV0cnkvUGhlbm9JRC9GbG93RGF0YUZpbGVzLzlNQk8iCm91dHB1dF9wYXRoIDwtICIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9GbG93Q3l0b21ldHJ5L1BoZW5vSUQvQW5hbHlzaXMvdGVzdGluZ0xpYnJhcnkvIgoKIyAxLmEgUmVhZCBpbiBGbG93Sm8gRmlsZXMgCgojIEluIEZpZ3VyZSAzIGRvd25zYW1wbGUgdG8gOTAwMCB3aGVyZSBwb3NzaWJsZQojIEhlcmUgZG93bnNhbXBsZSB0byAxMDAwIHRvIHNwZWVkIHVwIGNvbXB1dGF0aW9uCmZsb3dzZXQgPC0gZnNjX3RvX2ZzKGlucHV0X3BhdGgsIGRvd25zYW1wbGUgPSAxMDAwKQojIGRvd24gc2FtcGxlIGNhbiBiZSBhIG51bWJlciwgJ25vbmUnIG9yICdtaW4nCgojIGxvb2sgYXQgZmlsZSBuYW1lcyBhbmQgcmVuYW1lIHdpdGggc2hvcnRlciBzYW1wbGUgbmFtZXMKCnNhbXBsZU5hbWVzKGZsb3dzZXQpCnNhbXBsZU5hbWVzKGZsb3dzZXQpIDwtIHNhbXBsZU5hbWVzKGZsb3dzZXQpIDwtIGMoIjM0NTBfMDMwNiIsIkFJVzAwMl8wMzA2IiwiQUpHMDAxQ18wMzA2IiwiMzQ1MF8wMzE3QSIsIkFJVzAwMl8wMzE3QSIsIkFKRzAwMUNfMDMxN0EiLCIzNDUwXzAzMTdCIiwiQUlXMDAyXzAzMTdCIiwiQUpHMDAxQ18wMzE3QiIpCnNhbXBsZU5hbWVzKGZsb3dzZXQpCgoKIyBpZiB3ZSB3YW50IHRvIHNhdmUgdGhlIGZsb3dzZXQgb2JqZWN0IG5vdyB3ZSBjYW4gCiMgdGhpcyB3b3VsZCBiZSByZWFkIGJhY2sgaW4gd2l0aCBmbG93c2V0IAojIAoKCgpgYGAKCkhhcm1vbml6ZSBkYXRhIHRvIHJlbW92ZSBiYXRjaCBvciB0ZWNobmljYWwgdmFyaWF0aW9uCgpUaGlzIHJlcXVpcmVzIHVzIHRvIGxvb2sgYW5kIHNlZSB3aGVyZSB0aGVyZSBhcmUgdHdvIHBlYWtzIHRvIGFsaWduLiBXZSBuZWVkIHRvIHZpc3VhbGl6ZSB0aGUgcGVha3Mgb2YgdGhlIHRyYW5zZm9ybWVkIGRhdGEgYmVmb3JlIGFsaWduaW5nLgoKYGBge3J9CgoKIyB3ZSBjYW4gZGVjaWRlZCB3aGF0IGxldmVsIG9mIHByb2Nlc3NpbmcgdG8gY2hvb3NlIHdpdGggdGhlIGFyZ3VtZW50ICdwcm9jZXNzaW5nJwojIGJpZXhwIG9ubHkgYXBwbGllcyBhIGJpZXhwb25lbnRpYWwgdHJhbnNmb3JtYXRpb24KIyBhbGlnbiBhcHBsaWVzIGJpZXhwIHRyYW5zZm9ybSBhbmQgdGhlbiBhbGlnbnMgcGVha3MKIyByZXRybyAoZGVmYXVsdCksIHRyYW5zZm9ybXMsIGFsaWducyBhbmQgdGhlbiByZXZlcnNlIHRyYW5zZm9ybXMKZmxvd3NldF9iaWV4cCA8LSBoYXJtb25pemUoZmxvd3NldCwgcHJvY2Vzc2luZyA9ICdiaWV4cCcpCiMgd2UgY2FuIHZpc3VhbGl6ZSB0aGUgcGVha3MgdG8gc2VlIHdoZXJlIHRoZXJlIGFyZSB0d28gcGVha3MgZm9yIGFsaWdubWVudAoKIyB3ZSBuZWVkIHRvIGVudGVyIHRoZSBjb2x1bW4gaW5kZXggZm9yIHdoaWNoIHBlYWtzIHRvIGFsaWduLCB0aGUgYWxpZ25tZW50IGZvciBvbmUgb3IgdHdvIHBlYWtzIGlzIG5vdCB0aGUgc2FtZS4gCiNwbG90ZGVuc2l0eV9mbG93c2V0KGZsb3dzZXQpCiNwbG90ZGVuc2l0eV9mbG93c2V0KGZsb3dzZXRfYmlleHApICMgdG8gc2VlIHRoZSBwZWFrcwoKZmxvd3NldF9hbGlnbiA8LSBoYXJtb25pemUoZmxvd3NldCwgcHJvY2Vzc2luZyA9ICdhbGlnbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB0d29fcGVha3MgPSBjKDc6MjApLAogICAgICAgICAgICAgICAgICAgICAgIG9uZV9wZWFrID0gYygxOjYsMjEpLCB0aHJlc2hvbGQgPSAwLjAxKQoKZmxvd3NldF9yZXRybyA8LSBoYXJtb25pemUoZmxvd3NldCwgcHJvY2Vzc2luZyA9ICdyZXRybycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICB0d29fcGVha3MgPSBjKDc6MjApLAogICAgICAgICAgICAgICAgICAgICAgIG9uZV9wZWFrID0gYygxOjYsMjEpLCB0aHJlc2hvbGQgPSAwLjAxKQojIyMgdGVzdCBhZ2FpbiBsYXRlciB3aXRob3V0IHJ1bm5pbmcgbGlicmFyeShmbG93Q29yZSkKZGYgPC0gZmxvd3NldF90b19jc3YoZmxvd3NldF9yZXRybykKCgoKCmBgYAoKTm93IHdlIGhhdmUgbWFkZSBhbGwgdGhlIGRpZmZlcmVudCBwcm9jZXNzaW5nIG9mIHRoZSBmc2MgZmlsZXMuICBXZSBjYW4gdmlzdWFsaXplIHRoZSBpbnRlbnNpdHkgaW4gY2VsbCBkZW5zaXR5IHBsb3RzIHRvIHNlZSB0aGUgYWxpZ25tZW50CgpgYGB7cn0KI3Bsb3RkZW5zaXR5X2Zsb3dzZXQoZmxvd3NldCkKCnBsb3RkZW5zaXR5X2Zsb3dzZXQoZmxvd3NldF9iaWV4cCkKcGxvdGRlbnNpdHlfZmxvd3NldChmbG93c2V0X2FsaWduKQojcGxvdGRlbnNpdHlfZmxvd3NldChmbG93c2V0X3JldHJvKQoKCmBgYAoKCgoKYGBge3J9CgojIHRoZSBmdW5jdGlvbiBtYWtlX3NldSB3aWxsIHRha2UgaW4gdGhlIGRmIG9mIGV4cHJlc3Npb24gYW5kIEFudGlib2R5L01hcmtlciBsaXN0IGFzIGEgdmVjdG9yIGFuZCBjcmVhdGUgYSBzZXVyYXQgb2JqZWN0LiBWYWx1ZXMgYXJlIHNjYWxlZC4gTWFya2VyIGV4cHJlc3Npb24gd2lsbCBiZSBpbiB0aGUgIlJOQSIgc2xvdC4gUENBIGlzIGNhbGN1bGF0ZWQgdXNpbmcgQUIgdmVjdG9yIGFzIHRoZSBmZWF0dXJlcyAKCiMgbWFrZSBzdXJlIHRvIGFsd2F5cyBrZWVwIHRoZSBzYW1lIGFudGlib2R5IG9yZGVyIG9yIHlvdXIgbGFiZWxzIHdpbGwgbm90IGJlIGNvcnJlY3QKCgojIGFudGlib2R5IGZlYXR1cmVzIGluIG9yZGVyIHRvIGFwcGVhciBvbiB0aGUgcGxvdHMKQUIgPC0gYygiQ0QyNCIsIkNENTYiLCJDRDI5IiwiQ0QxNSIsIkNEMTg0IiwiQ0QxMzMiLCJDRDcxIiwiQ0Q0NCIsIkdMQVNUIiwiQVFQNCIsIkhlcGFDQU0iLCAiQ0QxNDBhIiwiTzQiKQpzZXUgPC0gbWFrZV9zZXUoZGYsIEFCX3ZlY3RvciA9IEFCKQoKCmBgYApZb3UgY2FuIHNhdmUgdGhlIGRhdGEgZnJhbWUgYW5kIHNldXJhdCBvYmplY3QgZm9yIGxhdGVyCgpgYGB7cn0KCgojIHRvIHNhdmUgdGhlIGRmIGZvciBsYXRlcgp3cml0ZS5jc3YoZGYsIHBhc3RlKG91dHB1dF9wYXRoLCJkZjEwMDAuY3N2Iiwgc2VwID0gIiIpKQoKIyBzYXZlIHRoZSBzZXVyYXQgb2JqZWN0CnNhdmVSRFMoc2V1LCBwYXN0ZShvdXRwdXRfcGF0aCwgInNldXJhdE9iamVjdDEwMDAuY3N2Iiwgc2VwID0gIiIpKQoKCgpgYGAKCgpSZWFkIGluIHRoZSBjc3Ygb2YgdGhlIGZsb3cgZmlsZXMgcHJvY2Vzc2VkIGFuZCB0aGUgc2V1cmF0IG9iamVjdAoKYGBge3J9CmRmLmlucHV0IDwtIHJlYWQuY3N2KHBhc3RlKG91dHB1dF9wYXRoLCAiZGYxMDAwLmNzdiIsIHNlcCA9ICIiKSkKCnNldSA8LSByZWFkUkRTKHBhc3RlKG91dHB1dF9wYXRoLCAic2V1cmF0T2JqZWN0MTAwMC5jc3YiLCBzZXAgPSAiIikpCgpgYGAKCiMgVGVzdCBvdXQgY2x1c3RlcmluZyBtZXRob2RzCjEuIEZsb3dzb20gLSByZXF1aXJlcyB0aGUgZGF0YSBmcmFtZSBmcm9tIGFib3ZlCjIuIFBoZW5vZ3JhcGggLSByZXF1aXJlcyBTZXVyYXQgb2JqZWN0IGZyb20gYWJvdmUKMy4gTG91dmFpbiB2aWEgU2V1cmF0IC0gcmVxdWlyZXMgU2V1cmF0IG9iamVjdCBmcm9tIGFib3ZlCgpUbyBydW4gaW50cmluc2ljIHN0YXRpc3RpY3Mgd2UgbmVlZCB0aGUgZGF0YSBmcmFtZSBmb3IgYWxsIGNsdXN0ZXJpbmcgbWV0aG9kcy4gCjEuIFNpbGhvdWV0dGUgc2NvcmU6IC0xIHRvIDEuQSB2YWx1ZSBuZWFyIC0xIGluZGljYXRlcyBhIHBvb3IgcXVhbGl0eSBvZiB0aGUgY2x1c3RlcnMgYSB2YWx1ZSBuZWFyIDEgaW5kaWNhdGVzIGEgZ29vZCBxdWFsaXR5IG9mIHRoZSBjbHVzdGVycy4KMi4gQ2FsaW5za2ktSGFyYWJhc3ogaW5kZXg6IGhpZ2hlciB2YWx1ZXMgaW5kaWNhdGUgYmV0dGVyIHF1YWxpdHkgY2x1c3RlcnMuCjMuIERhdmllcy1Cb3VsZGluIGluZGV4OiBsb3dlciB2YWx1ZXMgaW5kaWNhdGUgYmV0dGVyIGNsdXN0ZXJzLiAgVGhlIG1pbiB2YWx1ZSBpcyAwLiAKCk5vdGUgdGhhdCBldmVuIHdpdGggb25seSAxMDAwIGNlbGxzIHRoZXNlIHByb2Nlc3NlcyBhcmUgc2xvdyBhbmQgaWYgeW91IHdhbnQgdG8gdGVzdCBsYXJnZXIgZGF0YSBzZXRzIHVzZSBiYXNlIFIgYW5kIEhQQy4gCgoKVGVzdCBGbG93c29tCgpgYGB7cn0KCmxpYnJhcnkoY2x1c3RyZWUpCgojIHRoZSBsb3dlc3QgZmxvd19rIHRvIHVzZSBpcyAzCgpmbG93LnRlc3QgPC0gZXhwbG9yZV9wYXJhbShpbnB1dCA9IHNldSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX21ldGhvZCA9ICdmbG93c29tJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGZfaW5wdXQ9IGRmLmlucHV0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2sgPSBjKDUsMTAsMTUsMjApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBoZW5vX2xvdV9rbiA9IE5VTEwsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGxvdV9yZXNvbHV0aW9uID0gTlVMTCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLnBsb3QgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBydW4uc3RhdHMgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX3RvID0gTlVMTCkKCmBgYApOb3RpY2UgaW4gdGhlIFVNQVBzIGFuZCBoZWF0bWFwcyBhIGxhcmdlIGFtb3VudCBvZiBjZWxscyBhcmUgYWxsIGluIG9uZSBvciB0d28gY2x1c3RlcnMgYW5kIHNtYWxsIGFtb3VudHMgb2YgY2VsbHMgZ29pbmcgaW50byBzbWFsbCBjbHVzdGVycy4gIFRoaXMgaXNuJ3QgZ29vZCBmb3IgdXMgdG8gbGFiZWwgY2VsbCB0eXBlcy4gCgpgYGB7cn0KIyBMb29rIGF0IHRoZSBpbnRyaW5zaWMgc3RhdGlzdGljcwpmbG93LnRlc3RbWzFdXQoKYGBgCgpUaGUgc3RhdGlzdGljcyBpbmRpY2F0ZSB0aGF0IHRoZSBmZXdlciB0aGUgbG93ZXN0IEsgdmFsdWUgaGFzIHRoZSBiZXN0IHF1YWxpdHkgY2x1c3RlcnMuIAoKCgpUZXN0IFBoZW5vZ3JhcGggY2x1c3RlcmluZwoKYGBge3J9CgpwaGVuby50ZXN0IDwtICBleHBsb3JlX3BhcmFtKHNldSwgI2ZvciBwaGVub2dyYXBoIGFuZCBsb3V2YWluIG9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX21ldGhvZCA9ICdwaGVub2dyYXBoJywgI3Rha2UgMSBjbHVzdGVyIG1ldGhvZAogICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2lucHV0PSBkZi5pbnB1dCwgI25lZWRlZCAgaWYgaW5wdXQgImZsb3dzb20iCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvd19rID0gTlVMTCwgI2sgZm9yIGZsb3dzb20KICAgICAgICAgICAgICAgICAgICAgICAgICBwaGVub19sb3Vfa24gPSBjKDE1MCwzMDAsNTAwKSwgI2tuIGZvciBwaGVub2dyYXBoIG9yIGxvdXZhaW4KICAgICAgICAgICAgICAgICAgICAgICAgICBsb3VfcmVzb2x1dGlvbiA9IE5VTEwsICNyZXNvbHV0aW9uIGZvciBsb3V2YWluCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLnBsb3QgPSBUUlVFLCAjcHJpbnQgaWYgcnVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLnN0YXRzID0gVFJVRSwgI3ByaW50IGFuZCByZXR1cm4gaWYgcnVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZV90byA9IE5VTEwpCgojIyBjbHVzdHJlZSBpbiBwaGVub2dyYXBoIGRvZXNuJ3QgbWFrZSBzZW5zZSBidXQgSSd2ZSBpbmNsdWRlZCBpdCB0byBzZWUgaXQgYW55d2F5CgoKCmBgYAoKCmBgYHtyfQoKIyBsb29rIGF0IHRoZSBpbnRyaW5zaWMgc3RhdHMgdGFibGUKcGhlbm8udGVzdFtbMV1dCgoKYGBgClRoZSBzaWxob3VldHRlIHNjb3JlIGFuZCBEQkkgYXJlIGJlc3QgZm9yIGZld2VyIGtuID0gNTAwIGJ1dCB0aGUgQ0hJIGlzIGJlc3QgZm9yIGtuID0gMzAwLiBUaGUgc3RhdHMgb24gY29udHJhZGljdGluZy4KCgoKVGVzdCBMb3V2YWluIGNsdXN0ZXJpbmcKCmBgYHtyfQoKIyBmb3IgYmVzdCBjbHVzdHJlZSB2aXN1YWxpemF0aW9uIGluY2x1ZGUgcmVzb2x1dGlvbiAwCgpsb3UudGVzdCA8LSBleHBsb3JlX3BhcmFtKGlucHV0ID0gc2V1LCAjZm9yIHBoZW5vZ3JhcGggYW5kIGxvdXZhaW4gb25seQogICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJfbWV0aG9kID0gImxvdXZhaW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkZl9pbnB1dCA9IGRmLmlucHV0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93X2sgPSBOVUxMLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBwaGVub19sb3Vfa24gPSBjKDYwLCAyMDApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBsb3VfcmVzb2x1dGlvbiA9IGMoMCwwLjI1LDAuNSwwLjgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBydW4ucGxvdCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bi5zdGF0cyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVfdG8gPSBOVUxMKQoKCgpgYGAKCmBgYHtyfQpsb3UudGVzdFtbMV1dCgpgYGAKVGhlIHN0YXRpc3RpYyBkaWZmZXIgZm9yIGJlc3QgY2x1c3RlcmluZy4gCk92ZXJhbGwgdGhlIGludHJpbnNpYyBzdGF0aXN0aWNzIGFyZSBub3QgaGVscGZ1bCBmb3IgdGhpcyBkYXRhIGZvciBjaG9vc2luZyBjbHVzdGVyIGNvbmRpdGlvbnMuICBXZSBkZWNpZGVkIHRvIHVzZSB0aGUgaGVhdG1hcHMgYW5kIFVNQVBTIGZvciBjbHVzdGVycyB0aGF0IGxvb2sgYmVzdCBmb3IgYW5ub3RhdGlvbi4gV2Ugd2FudCBjbHVzdGVycyB0aGF0IGFyZSBkaXN0aW5jdCBmcm9tIGVhY2hvdGhlciBvbiB0aGUgVU1BUCBhbmQgaGF2ZSBjbGVhciBtYXJrZXJzIG9uIHRoZSBoZWF0bWFwLiBXZSB0aGVuIHVzZWQgdGhlIFJBTkQgSW5kZXggdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCBjbHVzdGVyIGNvbmRpdGlvbnMuIAoKCkNoZWNrIGNsdXN0ZXIgc3RhYmlsaXR5IC0gYmVzdCByZXNvbHV0aW9uL2NsdXN0ZXIgbnVtYmVyL2sgdmFsdWUgYnkgY2FsY3VsYXRpbmcgUkFORCBJbmRleCBhbmQgU1REIG9mIGNsdXN0ZXIgbnVtYmVyCgpgYGB7cn0KClJJIDwtIGNsdXN0X3N0YWJpbGl0eShpbnB1dCA9IHNldSwKICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9ucyA9IGMoMC4xLDAuMjUsMC41LDAuOCwxKSwKICAgICAgICAgICAgICAgICAgICAgICBrbiA9IDYwLAogICAgICAgICAgICAgICAgICAgICAgIG4gPSA1LCAjbnVtYmVyIG9mIGl0ZXJhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICBzYXZlX3RvID0gTlVMTCkKCiMgaXQgaXMgcmVjb21tZW5kZWQgdG8gcnVuIG49IDEwMCwgaG93ZXZlciBJIHJhbiBvbmx5IDUgaGVyZSBiZWNhdXNlIGl0IGlzIGxvbmcgdG8gY2FsY3VsYXRlCgoKYGBgCgpgYGB7cn0KIAojTG9vayBhdCB0aGUgUkkgcmVzdWx0cwpwbG90X3JhbmRpbmRleCgKICAgIHJkZiA9IFJJJGxpc3QsCiAgICBjcCA9IGMoIm9yYW5nZSIsICJ2aW9sZXQiKSwKICAgIHZpZXcgPSBjKDAsIDEpICN6b29tIGluIHggYXhpcywgdGhpcyBkb2VzIG5vdCBjaGFuZ2VzIHNjYWxlcywganVzdCB0aGUgdmlld2FibGUgc2VjdGlvbnMKKQoKIyBUaGUgUkFORCBpbmRleCBpbmRpY2F0ZXMgaWYgY2VsbHMgYXJlIHB1dCBpbnRvIHRoZSBzYW1lIGNsdXN0ZXIgZWFjaCB0aW1lIHRoZSBjbHVzdGVyaW5nIGlzIHJlcGVhdGVkIC0gMSBtZWFuIHRoZXkgYXJlIGV4YWN0bHkgdGhlIHNhbWUuIFdlIHJhbiAxMCB0aW1lcyBzbyB0aGVyZSBhcmUgOSBSSSBmb3IgZWFjaCByZXNvbHV0aW9uLiAgVGhlcmUgYXJlIDEwIGNvdW50cyBvZiB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIChvbmUgZm9yIGVhY2ggaXRlcmF0aW9uKS4gQ2x1c3RlciBudW1iZXIgdG9vIGxvdyB3aWxsIG5vdCBhY2NvdW50IGZvciB0aGUgdHJ1ZSBkaWZmZXJlbmNlcyBpbiBncm91cHMsIGNsdXN0ZXIgbnVtYmVycyB0b28gaGlnaCBhcmUgZGlmZmljdWx0IHRvIGFubm90YXRlLgoKCmBgYAoKCkFmdGVyIGNoZWNraW5nIHBhcmFtZXRlcnMgcnVuIGNsdXN0ZXIgZnVuY3Rpb24gdG8gbWFrZSBhZGQgdGhlIGNsdXN0ZXJpbmcgaW5mb3JtYXRpb24gaW50byB0aGUgCgpgYGB7cn0KCnNldSA8LSBnZXRfY2x1c3RlcnMoc2V1LCBtZXRob2QgPSAibG91dmFpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9pbnB1dCA9IGRmLmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgayA9IDYwLAogICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBwbG90cyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlX3Bsb3RzID0gRkFMU0UpCiMgaWYgc2F2ZV9wbG90cyBpcyBUUlVFIHRoZSBmZWF0dXJlIHBsb3RzIHdpbGwgYmUgc2F2ZSBhcyAxMyBwbG90cyBpbiBvbmUgZmlsZS4gVGhlIFVNQVAgd2l0aCBjbHVzdGVyIG51bWJlcnMgd2lsbCBhbHNvIGJlIHNhdmVkLgoKYGBgCgoKIyBBbm5vdGF0ZSBjbHVzdGVycwoxLiBWaXN1YWxpemF0aW9uIGZvciBtYW51YWwgYW5ub3RhdGlvbi4gLSBvdXRwdXQgYnkgY2x1c3RlcmluZyBmdW5jdGlvbgoyLiBDQU0gKENvcnJlbGF0aW9uIGFzc2lnbm1lbnQgbW9kZWwpIC0gcmVxdWlyZXMgcmVmZXJlbmNlIG1hdHJpeAozLiBSRk0gKFJhbmRvbSBGb3Jlc3QgTW9kZWwpIC0gcmVxdWlyZXMgYW5ub3RhdGVkIG1hdGNoaW5nIGZsb3cgZGF0YXNldAo0LiBTZXVyYXQgbGFiZWwgdHJhbnNmZXIgLSByZXF1aXJlcyBhbm5vdGF0ZWQgbWF0Y2hpbmcgZmxvdyBkYXRhIGluIGEgc2V1cmF0IG9iamVjdAoKVmlzdWFsaXplIGV4cHJlc3Npb24gb24gVU1BUCBhbmQgd2l0aCBoZWF0IG1hcHMKCmBgYHtyfQoKQUIgPC0gYygiQ0QyNCIsIkNENTYiLCJDRDI5IiwiQ0QxNSIsIkNEMTg0IiwiQ0QxMzMiLCJDRDcxIiwiQ0Q0NCIsIkdMQVNUIiwiQVFQNCIsIkhlcGFDQU0iLCAiQ0QxNDBhIiwiTzQiKQoKCiMgdGhpcyB3aWxsIGxldCB1cyBzZWUgb25lIGF0IGF0IHRpbWUKZm9yIChpIGluIEFCKSB7CiAgcHJpbnQoRmVhdHVyZVBsb3Qoc2V1LCBmZWF0dXJlcyA9IGksIG1pbi5jdXRvZmYgPSAncTEnLCBtYXguY3V0b2ZmID0gJ3E5NycsIGxhYmVsID0gVFJVRSkpCn0KCgpgYGAKClNvbWUgbW9yZSB2aXN1YWxpemF0aW9uIG9mIGV4cHJlc3Npb24gdmFsdWVzCgpgYGB7cn0KCiMgc3VtbWFyeSBoZWF0IG1hcAojIHVzZSBmdW5jdGlvbiBwbG90bWVhbgoKbGVuZ3RoKHVuaXF1ZShzZXUkUk5BX3Nubl9yZXMuMSkpCiMgMTIgCiMgaWYgd2Ugd2FudCB0byBwbG90IGJ5IGNsdXN0ZXIgd2UgbmVlZCBhIHZlY3RvciBvZiBmcm9tIDAgdG8gdGhlIG4tMSBjbHVzdGVycwpjbHVzdGVyLm51bSA8LSBjKDA6MTEpCgpwbG90bWVhbihwbG90X3R5cGUgPSAnaGVhdG1hcCcsc2V1ID0gc2V1LCBncm91cCA9ICdSTkFfc25uX3Jlcy4xJywgbWFya2VycyA9IEFCLCAKICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzID0gY2x1c3Rlci5udW0sIHNsb3QgPSAnc2NhbGUuZGF0YScsIHhsYWIgPSAiQ2x1c3RlciIsCiAgICAgICAgIHlsYWIgPSAiQW50aWJvZHkiKQoKCmBgYAoKYGBge3J9CiMgcHJlZGljdCBjZWxsIHR5cGUgZnJvbSBsb29raW5nIGF0IGV4cHJlc3Npb24gcGF0dGVybnMKbXlhbm4gPC0gYygidW5rbm93biIsImdsaWEiLAogICAgICAgICAgICJyYWRpYWwgZ2xpYSIsIm5ldXJvbnMxIiwgInJhZGlhbCBnbGlhIiwKICAgICAgICAgICAiYXN0cm9jeXRlcyIsInJhZGlhbCBnbGlhIiwKICAgICAgICAgICAiYXN0cm9jeXRlcyIsIm5ldXJvbnMyIiwKICAgICAgICAgICAiTlBDIiwiZW5kb3RoZWxpYWwiLAogICAgICAgICAgICJhc3Ryb2N5dGVzIikKCm1hbi5hbm4gPC0gZGF0YS5mcmFtZShDbHVzdGVyID0gYygwOjExKSwgTXlBbm4gPSBteWFubikKbWFuLmFubgoKbWFuLmFubiRDbHVzdGVyIDwtIGFzLmZhY3RvcihtYW4uYW5uJENsdXN0ZXIpCm1hbi5hbm4kTXlBbm4gPC0gYXMuZmFjdG9yKG1hbi5hbm4kTXlBbm4pCm1hbi5hbm4KCmBgYAoKYGBge3J9CnNhdmVSRFMoc2V1LCBwYXN0ZShvdXRwdXRfcGF0aCwgIlNldXJhdF90ZW1wLlJEUyIsIHNlcCA9ICIiKSkKCmBgYAoKCgpQcmVkaWN0IGNlbGwgYW5ub3RhdGlvbnMgd2l0aCBDQU0gKENvcnJhbGF0aW9ucyBhc3NpZ25tZW50IG1ldGhvZCkKCmBgYHtyfQoKcmVmZXJlbmNlX3BhdGggPC0gIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0dJVEhVQi9DZWxsdHlwZVIvRGF0YS9SZWZlcmVuY2VNYXRyaXg5Y2VsbHR5cGVzT3JkZXJlZC5jc3YiCgpyZWZlcmVuY2VfZGF0YSA8LSByZWFkLmNzdihyZWZlcmVuY2VfcGF0aCkKCmNvciA8LSBmaW5kX2NvcnJlbGF0aW9uKHRlc3QgPSBkZi5pbnB1dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcmVmZXJlbmNlX2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9jb3JyID0gMC40NSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2RpZmYgPSAwLjA1KQoKIyBjcmVhdGVzIGEgZGF0YWZyYW1lIHdpdGggY29yMSBjb3IyIGFuZCBwcmVkaWN0ZWQgY2VsbCB0eXBlIGxhYmVsCgoKCmBgYAoKVmlzdWFsaXplIHRoZSBDQU0gcmVzdWx0cwoKYGBge3J9CgpwbG90X2NvcnIoY29yKQoKCmBgYAoKQXBwbHkgY29ycmVsYXRpb24gcHJlZGljdGlvbnMgdG8gY2x1c3RlcnMgYW5kIG91dHB1dCBhIHZlY3RvciBmb3IgYW5ub3RhdGlvbiBmdW5jdGlvbnMKCmBgYHtyfQoKCiMgYWRkIHRoZSBjb3JyZWxhdGlvbiBwcmVkaWN0aW9ucyB0byB0aGUgbWV0YSBkYXRhCnNldSA8LSBBZGRNZXRhRGF0YShvYmplY3Q9c2V1LCBtZXRhZGF0YT1jb3IkY2VsbC5sYWJlbCwgY29sLm5hbWUgPSAnY29yLmxhYmVscycpCiMgc2VlIHRoZSBsYWJlbHMgYWRkZWQKdW5pcXVlKHNldSRjb3IubGFiZWxzKQoKc2V1LmNsdXN0ZXIgPSBzZXUkUk5BX3Nubl9yZXMuMQpzZXUubGFiZWxzID0gc2V1JGNvci5sYWJlbHMKCiMgcGxvdCB0aGUgY2x1c3RlciBwcmVkaWN0aW9ucwpwbG90X2xhYl9jbHVzdChzZXUsIHNldSRSTkFfc25uX3Jlcy4xLCBzZXUkY29yLmxhYmVscykKCgoKCmBgYAoKUnVuIGdldCBhbm5vdGF0aW9ucyBmdW5jdGlvbiB0byByZXR1cm4gYSB2ZWN0b3Igb2YgYW5ub3RhdGlvbiBpbiB0aGUgb3JkZXIgb2YgdGhlIGNsdXN0ZXJzLgoKYGBge3J9Cgpjb3IuYW5uIDwtIGdldF9hbm5vdGF0aW9uKHNldSwgc2V1LmNsdXN0ZXIgPSBzZXUkUk5BX3Nubl9yZXMuMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V1LmxhYmVsID0gc2V1JGNvci5sYWJlbHMsIHRvcF9uID0gMywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX291dCA9IGMoIlVua25vd24iLCJ1bmtub3duIiwiTWl4ZWQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgPSAiQ0FNIikKY29yLmFubgpkaW0oY29yLmFubikKCmNvci5hbm4gPC0gY29yLmFublsxOjEyLF0KZGltKGNvci5hbm4pCgp1bmlxdWUoY29yLmFubiRDQU0pCmxlbmd0aChjb3IuYW5uJENBTSkKCmBgYAoKCgoKClVzZSBhIHRyYWluZWQgUmFuZG9tIEZvcmVzdCBtb2RlbCB0byBwcmVkaWN0IGNlbGwgdHlwZXMuIApUcmFpbmluZyBvZiB0aGUgUmFuZG9tIEZvcmVzdCBtb2RlbCB3aXRoIGFuIGFubm90YXRlZCBkYXRhIHNldCBpcyBiZWxvdy4KCmBgYHtyfQoKIyB5b3UgbXVzdCBoYXZlIGEgc2F2ZWQgdHJhaW5lZCBtb2RlbCBmcm9tIGEgZGF0YSBvYmplY3QgYW5ub3RhdGVkIGZyb20gdGhlIHNhbWUgbWFya2VycwojIHNlZSB0aGUgZW5kIG9mIHRoZSB3b3JrYm9vayBmb3IgaG93IHRvIHRyYWluIHRoZSBtb2RlbAoKcmYgPC0gcmVhZFJEUygiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvRmxvd0N5dG9tZXRyeS9QaGVub0lEL0FuYWx5c2lzL1BhcGVyRmlndXJlcy9SRk1fdHJhaW5lZC4xMTA3MjAyMi5SZHMiKQoKQUIgPC0gYygiQ0QyNCIsIkNENTYiLCJDRDI5IiwiQ0QxNSIsIkNEMTg0IiwiQ0QxMzMiLCJDRDcxIiwiQ0Q0NCIsIkdMQVNUIiwiQVFQNCIsIkhlcGFDQU0iLCAiQ0QxNDBhIiwiTzQiKQoKcmZtLnByZWQgPC0gUkZNX3ByZWRpY3Qoc2V1LCByZikKaGVhZChyZm0ucHJlZCkKCiMgYWRkIHRoZSBwcmVkaWN0aW9ucyBpbnRvIHRoZSBzZXVyYXQgb2JqZWN0CgpzZXUgPC0gQWRkTWV0YURhdGEob2JqZWN0PXNldSwgbWV0YWRhdGE9cmZtLnByZWQkcmZtLmxhYmVscywgY29sLm5hbWUgPSAncmZtLmxhYmVscycpCgojIGNoZWNrIHRoYXQgdGhlIGRhdGEgaXMgYWRkZWQgCnRhYmxlKHNldSRyZm0ubGFiZWxzKQoKCmBgYAoKR2V0IHRoZSBhbm5vdGF0aW9uIGJ5IGNsdXN0ZXIgZm9yIHRoZSBSRk0KCmBgYHtyfQoKcmZtLmFubiA8LSBnZXRfYW5ub3RhdGlvbihzZXUsIHNldSRSTkFfc25uX3Jlcy4xLHNldSRyZm0ubGFiZWxzLCAKICAgICAgICAgICAgICAgdG9wX24gPSAzLCBmaWx0ZXJfb3V0ID0gYygidW5rbm93biIsIlVua25vd24iLCJNaXhlZCIsIk1peCIpLCBMYWJlbCA9ICJSRk0iKQpyZm0uYW5uCgojcmZtLmFubiA8LSBnZXRfYW5ub3RhdGlvbihzZXUsIHNldSRSTkFfc25uX3Jlcy4wLjgsc2V1JHJmbS5sYWJlbHMsIAogIyAgICAgICAgICAgICAgdG9wX24gPSAzLCBmaWx0ZXJfb3V0ID0gRkFMU0UsIExhYmVsID0gIlJGTSIpCnJmbS5hbm4KZGltKHJmbS5hbm4pCgoKYGBgCgpQbG90IFJGTSBwcmVkaWN0aW9ucwoKYGBge3J9CgoKcGxvdF9sYWJfY2x1c3Qoc2V1LCBzZXUuY2x1c3RlciA9IHNldSRSTkFfc25uX3Jlcy4xLCBzZXUubGFiZWxzID0gc2V1JHJmbS5sYWJlbHMsIGZpbHRlcl9vdXQgPSBjKCJ1bmtub3duIiwiVW5rbm93biIsIk1peGVkIikpCgoKYGBgCgoKClByZWRpY3RpbmcgY2VsbCB0eXBlcyB3aXRoIFNldXJhdCBsYWJlbCB0cmFuc2ZlciB1c2luZyBhbmNob3JzCgoKYGBge3J9CgojIHRha2VzIGluIGEgc2V1cmF0IG9iamVjdCB3aXRoIHRoZSBsYWJlbHMgYWRkZWQgCiMgbWFrZXMgYSBkYXRhZnJhbWUgd2l0aCB0aGUgY291bnQgb2YgcHJlZGljdGVkIGxhYmVscyBmb3IgZWFjaCBjbHVzdGVyCiMgaW5wdXQgc2V1cmF0IG9iamVjdCB3aXRoIHRoZSBwcmVkaWN0ZWQgbGFiZWxzIGluIHRoZSBtZXRhIGRhdGEKIyBpbnB1dCB0aGUgY2x1c3RlcnMgbWV0YSBkYXRhIHNsb3QgdG8gYmUgbGFiZWxzCiMgaW5wdXQgdGhlIG1ldGEgZGF0YSBzbG90IHdpdGggdGhlIGxhYmVscyAoY29ycmVsYXRpb24sIHJhbmRvbSBmb3Jlc3QsIHNldXJhdCBwcmVkaWN0ZWQpCgojbmVlZCByZWZlcmVuY2UgZGF0YSBvYmplY3Qgd2l0aCBsYWJlbHMKc2V1LnI8LSByZWFkUkRTKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9GbG93Q3l0b21ldHJ5L1BoZW5vSUQvQW5hbHlzaXMvUGFwZXJGaWd1cmVzL1NldTkwMDBhbm5vdC4wODA3MjAyMS5SRFMiKQoKCiMgdGhlIG91dHB1dCBpcyBhIHNldXJhdCBvYmplY3Qgd2l0aCB0aGUgcHJlZGljdGVkIGFubm90YXRpb25zCgpzZXUgPC0gc2V1cmF0X3ByZWRpY3Qoc2V1LCBzZXUuciwgcmVmX2lkID0gJ3N1Ymdyb3VwcycsIGRvd24uc2FtcGxlID0gNTAwLCBtYXJrZXJzID0gQUIpCgoKCgpgYGAKCmBgYHtyfQoKIyBwbG90IHRoZSBzZXVyYXQgYW5jaG9yIHByZWRpY3Rpb25zCiMgZ2V0IHRoZSBhbm5vdGF0aW9uIHRhYmxlIGZvciB0aGUgc2V1cmF0IGFuY2hvciBwcmVkaWN0aW9ucyAKCnBsb3RfbGFiX2NsdXN0KHNldSwgc2V1JFJOQV9zbm5fcmVzLjEsIHNldSRzZXUucHJlZCkKCiMgdG8gbm90IGZpbHRlciBhbnl0aGluZyB1c2UgYygpCnNldS5hbm4gPC0gZ2V0X2Fubm90YXRpb24oc2V1LCBzZXUkUk5BX3Nubl9yZXMuMSxzZXUkc2V1LnByZWQsIAogICAgICAgICAgICAgICB0b3BfbiA9IDMsIGZpbHRlcl9vdXQgPSBjKCksIExhYmVsID0gIlNldXJhdCIpCnNldS5hbm4KCgpgYGAKCkdldCBhIGNvbnNlbnN1cyBvZiBjbHVzdGVyIGFubm90YXRpb25zLCBBZGQgdGhlIGFubm90YXRpb25zIHRvIHRoZSBzZXVyYXQgb2JqZWN0CgoKCmBgYHtyfQoKIyBtYWtlIGEgbGlzdCBvZiBkYXRhIGZyYW1lcwojIGFsbCB0aGUgZGF0YWZyYW1lcyBuZWVkIHRvIGJlIGFzLmZhY3Rvcgphbm4ubGlzdCA8LSBsaXN0KGNvci5hbm4scmZtLmFubixzZXUuYW5uLCBtYW4uYW5uKQoKIyBhbm5vdGF0ZSB0aGUgc2V1cmF0IG9iamVjdAoKc2V1IDwtIGNsdXN0ZXJfYW5ub3RhdGUoc2V1LCBhbm4ubGlzdCA9IGFubi5saXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbl9uYW1lID0iQ2VsbFR5cGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgdG9fbGFiZWwgPSAiUk5BX3Nubl9yZXMuMSIpCgpEaW1QbG90KHNldSwgZ3JvdXAuYnkgPSAiQ2VsbFR5cGUiKQoKCmBgYAoKSnVzdCB1c2UgdGhlIGFubm90YXRlIGZ1bmN0aW9ucwoKYGBge3J9CgpzZXUgPC0gYW5ub3RhdGUoc2V1LCBhbm5vdGF0aW9ucyA9IHNldS5hbm4kU2V1cmF0LCB0b19sYWJlbCA9ICJSTkFfc25uX3Jlcy4xIiwgYW5ub3RhdGlvbl9uYW1lID0gIlNldXJhdFRyYW5zZmVyIikKCkRpbVBsb3Qoc2V1LCBncm91cC5ieSA9ICJTZXVyYXRUcmFuc2ZlciIpCgpgYGAKCiMgQ29tcGFyZSBncm91cHMKCldlIGZpcnN0IG5lZWQgdG8gYWRkIHRoZSB2YXJpYWJsZXMgaW50byB0aGUgc2V1cmF0IG9iamVjdCB0aGF0IHdlIHdhbnQgdG8gY29tcGFyZS4KCmBgYHtyfQpHZW5vdHlwZSA8LSBjKCIzNDUwIiwiMzQ1MCIsIjM0NTAiLCJBSVcwMDIiLCJBSVcwMDIiLCJBSVcwMDIiLCJBSkcwMDFDIiwiQUpHMDAxQyIsIkFKRzAwMUMiKQpFeERhdGUgPC0gYygiMDMwNiIsIjAzMTciLCIwMzE3IiwiMDMwNiIsIjAzMTciLCIwMzE3IiwiMDMwNiIsIjAzMTciLCIwMzE3IikKQmF0Y2ggPC0gYygiQiIsIkIiLCJBIiwiQiIsIkIiLCJBIiwiQiIsIkIiLCJBIikKQWdlIDwtIGMoIjI3MyIsIjI4NCIsIjI2MyIsIjI3MyIsIjI4NCIsIjI2MyIsIjI3MyIsIjI4NCIsIjI2MyIpCgojIEdlbm90eXBlCklkZW50cyhzZXUpIDwtICJTYW1wbGUiCmNsdXN0ZXIuaWRzIDwtIEdlbm90eXBlCiMgdmVjdG9yIHdpdGggdGhlIG5ldyBuYW1lcyAtIHlvdSBuZWVkIHRoaXMgdmVjdG9yIGZyb20gbWUKCm5hbWVzKGNsdXN0ZXIuaWRzKSA8LSBsZXZlbHMoc2V1KSAgICAjIGdldCB0aGUgbGV2ZWxzCnNldSA8LSBSZW5hbWVJZGVudHMoc2V1LCBjbHVzdGVyLmlkcykgIyByZW5hbWUgIApzZXUkR2Vub3R5cGUgPC0gSWRlbnRzKHNldSkgICAjIGFkZCBhIG5ldyBkYXRhc2xvdAoKIyBFeHBlcmltZW50IGRhdGUKSWRlbnRzKHNldSkgPC0gIlNhbXBsZSIKY2x1c3Rlci5pZHMgPC0gRXhEYXRlCiMgdmVjdG9yIHdpdGggdGhlIG5ldyBuYW1lcyAtIHlvdSBuZWVkIHRoaXMgdmVjdG9yIGZyb20gbWUKCm5hbWVzKGNsdXN0ZXIuaWRzKSA8LSBsZXZlbHMoc2V1KSAgICAjIGdldCB0aGUgbGV2ZWxzCnNldSA8LSBSZW5hbWVJZGVudHMoc2V1LCBjbHVzdGVyLmlkcykgIyByZW5hbWUgIApzZXUkRXhEYXRlIDwtIElkZW50cyhzZXUpICAgIyBhZGQgYSBuZXcgZGF0YXNsb3QKCiMgQmF0Y2gKSWRlbnRzKHNldSkgPC0gIlNhbXBsZSIKY2x1c3Rlci5pZHMgPC0gQmF0Y2gKIyB2ZWN0b3Igd2l0aCB0aGUgbmV3IG5hbWVzIC0geW91IG5lZWQgdGhpcyB2ZWN0b3IgZnJvbSBtZQoKbmFtZXMoY2x1c3Rlci5pZHMpIDwtIGxldmVscyhzZXUpICAgICMgZ2V0IHRoZSBsZXZlbHMKc2V1IDwtIFJlbmFtZUlkZW50cyhzZXUsIGNsdXN0ZXIuaWRzKSAjIHJlbmFtZSAgCnNldSRCYXRjaCA8LSBJZGVudHMoc2V1KSAgICMgYWRkIGEgbmV3IGRhdGFzbG90CgojIGRheXMgaW4gZmluYWwgZGlmZmVyZW50aWF0aW9uIG1lZGlhCklkZW50cyhzZXUpIDwtICJTYW1wbGUiCmNsdXN0ZXIuaWRzIDwtIEFnZQojIHZlY3RvciB3aXRoIHRoZSBuZXcgbmFtZXMgLSB5b3UgbmVlZCB0aGlzIHZlY3RvciBmcm9tIG1lCgpuYW1lcyhjbHVzdGVyLmlkcykgPC0gbGV2ZWxzKHNldSkgICAgIyBnZXQgdGhlIGxldmVscwpzZXUgPC0gUmVuYW1lSWRlbnRzKHNldSwgY2x1c3Rlci5pZHMpICMgcmVuYW1lICAKc2V1JERheXNpbkN1bHR1cmUgPC0gSWRlbnRzKHNldSkgICAjIGFkZCBhIG5ldyBkYXRhc2xvdAoKCgpgYGAKClBsb3RzIHNvbWUgdmFyaWFibGVzIHRvIGxvb2sgZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gZ3JvdXBzCgpgYGB7cn0KIyBvbmUgcGxvdApwcm9wb3J0aW9ucGxvdHMoc2V1LnEsc2V1LnZhciA9IHNldSRHZW5vdHlwZSwgc2V1LmxhYmxlID0gc2V1JENlbGxUeXBlLCBncm91cHMgPSAiR2Vub3R5cGUiKQojIGFkZCBjb2xvdXJzCmNvbG91cnMgPC0gYygiY2hvY29sYXRlMSIsImNob2NvbGF0ZTMiLCJvcmFuZ2UiLAogICAgICAgICAgICAgICAgICAgImxpZ2h0c2FsbW9uIiwgInBpbmsiLCJsaWdodHBpbmszIiwKICAgICAgICAgICAgICAgICAgICJzdGVlbGJsdWUzIiwiZGVlcHNreWJsdWUiLAogICAgICAgICAgICAgICAgICAgInBsdW0zIiwicHVycGxlIiwKICAgICAgICAgICAgICAgICAgICJzZWFncmVlbjMiLCJ0b21hdG80IiwiYnVybHl3b29kMyIsImdyZXk5MCIsImJyb3duIiwKICAgICAgICAgICAgICJyb3lhbGJsdWUzIiwgInRhbjQiLCJ5ZWxsb3dncmVlbiIpCgpwcm9wb3J0aW9ucGxvdHMoc2V1LnEsc2V1LnZhciA9IHNldSRHZW5vdHlwZSwgc2V1LmxhYmxlID0gc2V1JENlbGxUeXBlLCBncm91cHMgPSAiR2Vub3R5cGUiLCBteV9jb2xvdXJzID0gY29sb3VycykKCmBgYAoKYGBge3J9CnZhci5saXN0IDwtIGxpc3Qoc2V1JERheXNpbkN1bHR1cmUsc2V1JEJhdGNoLHNldSRFeERhdGUsc2V1JEdlbm90eXBlKQp2YXJuYW1lcyA8LSBjKCJEYXlzIGluIEN1bHR1cmUiLCAiQmF0Y2giLCAiRXhwZXJpbWVudCBEYXRlIiwgIkdlbm90eXBlIikKIyBwbG90IGFsbCB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0IGF0IG9uY2UKCnBsb3Rwcm9wb3J0aW9ucyhzZXUsIHZhci5saXN0ID0gdmFyLmxpc3QsIHhncm91cCA9IHNldSRDZWxsVHlwZSwgdmFybmFtZXMgPSB2YXJuYW1lcywgbXlfY29sb3VycyA9IGMoImJsdWUiLCJyZWQiKSkKCgoKCmBgYAoKTWFrZSBhIGhlYXQgbWFwIAoKYGBge3J9CgojIG1ha2Ugc3VyZSB0aGUgb3JkZXIgaXMgY29ycmVjdCBhbmQgdGhlcmUgYXJlIG9ubHkgdGhlIGFtb3VudCBvZiBkaWZmZXJlbnQgY2VsbCB0eXBlcy4gIFRoZSBvcmRlciBjYW4gYmUgZm91bmQgaW4gdGhlIGRpbXBsb3QgYWJvdmUgCgp2YXJfbmFtZXMgPC0gYygidW5rbm93biIsImFzdHJvY3l0ZSIsImVwaXRoZWxpYWwiLCJuZXVyb25zIDEiLAogICAgICAgICAgICAgICAiZW5kb3RoZWxpYWwiLCAibnBjIiwiYXN0cm9jeXRlcyIpCgpwbG90bWVhbihwbG90X3R5cGUgPSAnaGVhdG1hcCcsc2V1ID0gc2V1LCBncm91cCA9ICdDZWxsVHlwZScsIG1hcmtlcnMgPSBBQiwgCiAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcyA9IHZhcl9uYW1lcywgc2xvdCA9ICdzY2FsZS5kYXRhJywgeGxhYiA9ICJDZWxsIFR5cGUiLAogICAgICAgICB5bGFiID0gIkFudGlib2R5IikKCgoKCmBgYAoKCgpgYGB7cn0KIyBkb3QgcGxvdAp2YXJfbmFtZXMgPC0gYygidW5rbm93biIsImFzdHJvY3l0ZSIsImVwaXRoZWxpYWwiLCJuZXVyb25zIDEiLAogICAgICAgICAgICAgICAiZW5kb3RoZWxpYWwiLCAibnBjIiwiYXN0cm9jeXRlcyIpCgoKIyBtYWtlIHN1cmUgdGhlIHRlcm1zIGFyZSBleGFjdGx5IHRoZSBzYW1lIGFuZCB5b3UgZG9uJ3QgbWlzcyBhbnkKbmV3Lm9yZGVyIDwtIGMoImFzdHJvY3l0ZSIsImFzdHJvY3l0ZXMiLCJlbmRvdGhlbGlhbCIsImVwaXRoZWxpYWwiLCJuZXVyb25zIDEiLAogICAgICAgICAgICAgICAibnBjIiwidW5rbm93biIpCm5ldy5vcmRlciA8LSByZXYobmV3Lm9yZGVyKQoKQUIub3JkZXIgPC0gYygiQ0QyNCIsIkNENTYiLCJDRDI5IiwiQ0QxNSIsIkNEMTg0IiwiQ0QxMzMiLCJDRDcxIiwiQ0Q0NCIsIkdMQVNUIiwiQVFQNCIsIkhlcGFDQU0iLCAiQ0QxNDBhIiwiTzQiKQoKcGxvdG1lYW4ocGxvdF90eXBlID0gJ2RvdHBsb3QnLHNldSA9IHNldSwgZ3JvdXAgPSAnQ2VsbFR5cGUnLCBtYXJrZXJzID0gQUIsIAogICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMgPSB2YXJfbmFtZXMsIHNsb3QgPSAnc2NhbGUuZGF0YScsIHhsYWIgPSAiQ2VsbCBUeXBlIiwKICAgICAgICAgeWxhYiA9ICJBbnRpYm9keSIsIHZhcjFvcmRlciA9IG5ldy5vcmRlciwgdmFyMm9yZGVyID0gQUIub3JkZXIpCgoKYGBgCgojIFN0YXRpc3RpY3MgY29tcGFyaW5nIGdyb3VwcwoKCgpgYGB7cn0KCiMgcHJlcGFyZSBhIGRhdGFmcmFtZSBmb3Igc3RhdHMKIyB0aGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBhbm5vdGF0ZWQgc2V1cmF0IG9iamVjdCB3aXRoIGFsbCB0aGUgdmFyaWFibGVzIGFscmVhZHkgZXhpc3RpbmcgYXMgbWV0YWRhdGEgc2xvdHMKCiMgY2hlY2sgd2hhdCBtZXRhIGRhdGEgc2xvdHMgZXhpc3QgaW4geW91ciBvYmplY3QKY29sbmFtZXMoc2V1QG1ldGEuZGF0YSkKCgoKYGBgCgoKYGBge3J9CiMgcnVuIHRoZSBmdW5jdGlvbgoKdmFyLm5hbWVzIDwtIGMoIlNhbXBsZSIsIkRheXNpbkN1bHR1cmUiLCAiQmF0Y2giLCAiRXhEYXRlIiwgIkdlbm90eXBlIiwgIkNlbGxUeXBlIikKCmRmLmZvci5zdGF0cyA8LSBQcmVwX2Zvcl9zdGF0cyhzZXUsIG1hcmtlcl9saXN0ID0gQUIsIHZhcmlhYmxlcyA9IHZhci5uYW1lcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJfbmFtZSA9ICdNYXJrZXInKQoKCiMgc2F2ZSB0aGUgY3N2IGZvciBsYXRlcgojIHdyaXRlLmNzdihkZi5mb3Iuc3RhdHMsIHBhc3RlKG91dHB1dF9wYXRoLCJmaWxlbmFtZS5jc3YiKSkKCmhlYWQoZGYuZm9yLnN0YXRzKQoKCmBgYAoKCkZpcnN0IHdlIGhhdmUgMyB2YXJpYWJsZXM6IEV4cGVyaW1lbnRhbCB2YXJpYWJsZSwgQ2VsbCB0eXBlcywgTWFya2VycwpXZSB3YW50IHRvIGNvbXBhcmUgdGhlIG1lYW4gZXhwcmVzc2lvbiBwZXIgZ3JvdXA6CkZvciBhbGwgYW50aWJvZGllcyB0b2dldGhlciBpbiBlYWNoIGNlbGwgdHlwZSBiZXR3ZWVuIGEgZ2l2ZW4gdmFyaWFibGUgKEdlbm90eXBlKSAoT25lIHdheSBhbm92YSkKV2Ugd2FudCB0byBjb21wYXJlIGVhY2ggYW50aWJvZHkgc2VwYXJhdGVseSBmb3IgYSBnaXZlbiB2YXJpYWJsZSBmb3IgZWFjaCBjZWxsIHR5cGUgKHR3byB3YXkgYW5vdmEpCgpgYGB7cn0KCgojIG9uZSB3YXkgYW5vdmEgKGNvbWJpbmUgYWxsIGFudGlib2RpZXMpCiMgdHdvIHdheSBhbm92YSB2YXJpYWJsZSAxID0gYW50aWJvZHkvbWFya2VyIHZhcmlhYmxlIDIgPSBncm91cCB2YXJpYWJsZQoKIyBub3JtYWxseSBydW5zIGEgbG9vcCBhY3Jvc3MgZWFjaCBjZWxsIHR5cGUKIyBvcHRpb24gdG8gc2VsZWN0IHRvIGNhbGN1bGF0ZSBmb3IgYWxsIGNlbGwgdHlwZXMgdG9nZXRoZXIKCiMgY2FuIHJ1biB0aGUgbG9vcCBhY3Jvc3MgYW50aWJvZGllcwoKIyBncm91cCB2YXJpYWJsZXMgd2UgY2FuIHJ1bjogR2Vub3R5cGUsIEJhdGNoLCBkYXlzIGluIGN1bHR1cmUsIEV4cGVyaW1lbnQgZGF0ZQoKIyB3ZSBydW4gb25lLXdheSBoZXJlIHdpdGggZGlmZmVyZW50IGNvbmRpdGlvbnMKCiMgY29tcGFyZSBnZW5vdHlwZXMgZm9yIGVhY2ggY2VsbCB0eXBlCnRlc3Quc3RhdHMxIDwtIHJ1bl9zdGF0cyhpbnB1dF9kZj0gZGYuZm9yLnN0YXRzLCBncm91cF9jb2xzID0gYygiU2FtcGxlIiwgIkNlbGxUeXBlIiwiTWFya2VyIiwiR2Vub3R5cGUiLCJCYXRjaCIpLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZV9jb2wgPSAidmFsdWUiLAogICAgICAgICAgICAgICAgICAgICBzdGF0X3R5cGUgPSAiQU5PVkEiLCBpZDEgPSAnR2Vub3R5cGUnLCAKICAgICAgICAgICAgICAgICAgICAgaWQyID0gTlVMTCwgdXNlX21lYW5zID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgbG9vcF9ieSA9ICJDZWxsVHlwZSIpCgojIHNlZSB0aGUgZGF0YWZyYW1lIHJlc3VsdHMKdGVzdC5zdGF0czFbWydBTk9WQSddXQp0ZXN0LnN0YXRzMVtbJ1R1a2V5SFNEJ11dCgoKCmBgYAoKYGBge3J9CiMgQ29tcGFyZSBleHByZXNzaW9uIGFjcm9zcyBjZWxsIHR5cGVzIGZvciBlYWNoIG1hcmtlcgp0ZXN0LnN0YXRzMiA8LSBydW5fc3RhdHMoaW5wdXRfZGY9IGRmLmZvci5zdGF0cywgZ3JvdXBfY29scyA9IGMoIlNhbXBsZSIsICJDZWxsVHlwZSIsIk1hcmtlciIsIkdlbm90eXBlIiwiQmF0Y2giKSwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVfY29sID0gInZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgc3RhdF90eXBlID0gIkFOT1ZBIiwgaWQxID0gJ0dlbm90eXBlJywgCiAgICAgICAgICAgICAgICAgICAgIGlkMiA9IE5VTEwsIHVzZV9tZWFucyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGxvb3BfYnkgPSAiTWFya2VyIikKdGVzdC5zdGF0czJbWydUdWtleUhTRCddXQpgYGAKCmBgYHtyfQojIGNvbXBhcmUgR2Vub3R5cGVzIGFjcm9zcyBhbGwgY2VsbCB0eXBlcyBhbmQgbWFya2Vycwp0ZXN0LnN0YXRzMyA8LSBydW5fc3RhdHMoaW5wdXRfZGY9IGRmLmZvci5zdGF0cywgZ3JvdXBfY29scyA9IGMoIlNhbXBsZSIsICJDZWxsVHlwZSIsIk1hcmtlciIpLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZV9jb2wgPSAidmFsdWUiLAogICAgICAgICAgICAgICAgICAgICBzdGF0X3R5cGUgPSAiQU5PVkEiLCBpZDEgPSAnR2Vub3R5cGUnLCAKICAgICAgICAgICAgICAgICAgICAgaWQyID0gTlVMTCwgdXNlX21lYW5zID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgbG9vcF9ieSA9ICdub25lJykKdGVzdC5zdGF0czNbWydUdWtleUhTRCddXQpgYGAKCmBgYHtyfQojIGNvbXBhcmUgZ2Vub3R5cGUgZm9yIGVhY2ggY2VsbCB0eXBlIHdpdGhvdXQgdGFraW5nIHRoZSBncm91cCBtZWFucyBhbmQgdXNpbmcgZWFjaCBjZWxsIGFzIGFuIG4gKG5vdCBnb29kIHByYWN0aWNlKQp0ZXN0LnN0YXRzNCA8LSBydW5fc3RhdHMoaW5wdXRfZGY9IGRmLmZvci5zdGF0cywgZ3JvdXBfY29scyA9IGMoIlNhbXBsZSIsICJDZWxsVHlwZSIsIk1hcmtlciIsIkdlbm90eXBlIiwiQmF0Y2giKSwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVfY29sID0gInZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgc3RhdF90eXBlID0gIkFOT1ZBIiwgaWQxID0gJ0dlbm90eXBlJywgCiAgICAgICAgICAgICAgICAgICAgIGlkMiA9IE5VTEwsIHVzZV9tZWFucyA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICBsb29wX2J5ID0gIkNlbGxUeXBlIikKCnRlc3Quc3RhdHM0W1sxXV0gIyBBTk9WQQoKYGBgCgoKVGVzdCB0d28gd2F5IEFOT1ZBcwoKYGBge3J9Cgp0ZXN0LnN0YXRzNSA8LSBydW5fc3RhdHMoaW5wdXRfZGY9IGRmLmZvci5zdGF0cywgZ3JvdXBfY29scyA9IGMoIlNhbXBsZSIsICJDZWxsVHlwZSIsIk1hcmtlciIsIkdlbm90eXBlIiwiQmF0Y2giKSwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVfY29sID0gInZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgc3RhdF90eXBlID0gIkFOT1ZBMiIsIGlkMSA9ICdHZW5vdHlwZScsIAogICAgICAgICAgICAgICAgICAgICBpZDIgPSAiTWFya2VyIiwgdXNlX21lYW5zID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgbG9vcF9ieSA9ICJDZWxsVHlwZSIpCgojIHNlZSB0aGUgcmVsZXZhbnQgaW50ZXJhY3Rpb25zIFR1a2V5J3MgcmVzdWx0cwoKZGYgPC0gYXMuZGF0YS5mcmFtZSh0ZXN0LnN0YXRzNVtbIlR1a2V5SFNEIl1dW1siSW50ZXJhY3Rpb25zXyBHZW5vdHlwZSJdXSkKaGVhZChkZikKCiMgbm93IGZpbHRlciBmb3Igc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMKCmRmX3NpZyA8LSBkZiAlPiUgZmlsdGVyKHAuYWRqIDwgMC4wNSkKZGZfc2lnCgoKCmBgYAoKCmBgYHtyfQp0ZXN0LnN0YXRzNiA8LSBydW5fc3RhdHMoaW5wdXRfZGY9IGRmLmZvci5zdGF0cywgZ3JvdXBfY29scyA9IGMoIlNhbXBsZSIsICJDZWxsVHlwZSIsIk1hcmtlciIsIkdlbm90eXBlIiwiQmF0Y2giKSwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVfY29sID0gInZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgc3RhdF90eXBlID0gIkFOT1ZBMiIsIGlkMSA9ICdHZW5vdHlwZScsIAogICAgICAgICAgICAgICAgICAgICBpZDIgPSAiQ2VsbFR5cGUiLCB1c2VfbWVhbnMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICBsb29wX2J5ID0gIk1hcmtlciIpCgoKIyBzZWUgdGhlIGludGVyYWN0aW9ucyBUdWtleSdzIHJlc3VsdHMgd2hlcmUgaWQxIG9yIGlkMiBtYXRjaAoKZGYgPC0gYXMuZGF0YS5mcmFtZSh0ZXN0LnN0YXRzNltbIlR1a2V5SFNEIl1dW1siSW50ZXJhY3Rpb25zXyBHZW5vdHlwZSJdXSkKaGVhZChkZikKCiMgbm93IGZpbHRlciBmb3Igc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMKCmRmX3NpZyA8LSBkZiAlPiUgZmlsdGVyKHAuYWRqIDwgMC4wNSkKZGZfc2lnCgpkZiA8LSBhcy5kYXRhLmZyYW1lKHRlc3Quc3RhdHM2W1siVHVrZXlIU0QiXV1bWyJJbnRlcmFjdGlvbnNfIENlbGxUeXBlIl1dKQpoZWFkKGRmKQojIG5vdyBmaWx0ZXIgZm9yIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzCmRmX3NpZyA8LSBkZiAlPiUgZmlsdGVyKHAuYWRqIDwgMC4wNSkKZGZfc2lnCgoKYGBgCgoKCgoKClRyYWluIFJhbmRvbSBGb3Jlc3QgbW9kZWwKUmVxdWlyZXMgYSBsYWJlbGxlZCBzZXVyYXQgb2JqZWN0Ck1vcmUgY2VsbHMgd2lsbCBnaXZlIGhpZ2hlciBhY2N1cmFjeSBidXQgaW5jcmVhc2UgY29tcHV0YXRpb24gdGltZS4KUnVuIGluIEhQQyB3aXRoIGxvdHMgb2YgY2VsbHMKCgpgYGB7cn0KCnJmIDwtIFJGTV90cmFpbihzZXVyYXRlX29iamVjdCA9IHNldSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJfbGlzdCA9IEFCLCBhbm5vdGF0aW9ucyA9IHNldSRDZWxsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gYygwLjgsMC4yKSwKICAgICAgICAgICAgICAgICAgICAgIGRvd25zYW1wbGUgPSAibm9uZSIsCiAgICAgICAgICAgICAgICAgICAgICBzZWVkID0gMjIyLAogICAgICAgICAgICAgICAgICAgICAgbXl0cnkgPSBjKDE6MTApLAogICAgICAgICAgICAgICAgICAgICAgbWF4bm9kZXMgPSBjKDEyOiAyNSksCiAgICAgICAgICAgICAgICAgICAgICB0cmVlcyA9IGMoMjUwLCA1MDAsIDEwMDAsMjAwMCksCiAgICAgICAgICAgICAgICAgICAgICBzdGFydF9ub2RlID0gMTUpCgojc2F2ZShyZiwgb3V0cHV0X3BhdGgsInRyYWluZWRSRk0uUmRzIikKCmBgYAoKCg==